[PATCH] D47784: [MS][ARM64]: Promote _setjmp to_setjmpex as there is no _setjmp in the ARM64 libvcruntime.lib

2018-06-06 Thread Chris January via Phabricator via cfe-commits
arm-chrjan01 added a comment.

Thank you for reviewing Reid. Please could you commit the change for me as I 
don't have commit rights.
I had a go at refactoring it but the args to the x86 _setjmp at different, and 
combining the aarch64 and x64 versions didn't make the code more readable, 
IMHO. Happy for you to refactor after landing.


Repository:
  rC Clang

https://reviews.llvm.org/D47784



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D47784: [MS][ARM64]: Promote _setjmp to_setjmpex as there is no _setjmp in the ARM64 libvcruntime.lib

2018-06-05 Thread Chris January via Phabricator via cfe-commits
arm-chrjan01 created this revision.
arm-chrjan01 added reviewers: simon_tatham, majnemer, rnk.
Herald added subscribers: cfe-commits, chrib.

Repository:
  rC Clang

https://reviews.llvm.org/D47784

Files:
  lib/CodeGen/CGBuiltin.cpp
  test/CodeGen/ms-setjmp.c


Index: test/CodeGen/ms-setjmp.c
===
--- test/CodeGen/ms-setjmp.c
+++ test/CodeGen/ms-setjmp.c
@@ -1,7 +1,9 @@
 // RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple i686-windows-msvc  
 -emit-llvm %s -o - | FileCheck --check-prefix=I386 %s
 // RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple 
x86_64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=X64 %s
+// RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple 
aarch64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=AARCH64 %s
 // RUN: %clang_cc1 -fms-extensions -triple i686-windows-msvc   -emit-llvm %s 
-o - | FileCheck --check-prefix=I386 %s
 // RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -emit-llvm %s 
-o - | FileCheck --check-prefix=X64 %s
+// RUN: %clang_cc1 -fms-extensions -triple aarch64-windows-msvc -emit-llvm %s 
-o - | FileCheck --check-prefix=AARCH64 %s
 typedef char jmp_buf[1];
 
 #ifdef DECLARE_SETJMP
@@ -21,12 +23,22 @@
   // X64:   %[[addr:.*]] = call i8* @llvm.frameaddress(i32 0)
   // X64:   %[[call:.*]] = call i32 @_setjmp(i8* getelementptr inbounds 
([1 x i8], [1 x i8]* @jb, i32 0, i32 0), i8* %[[addr]])
   // X64-NEXT:  ret i32 %[[call]]
+
+  // AARCH64-LABEL: define dso_local i32 @test_setjmp
+  // AARCH64:   %[[addr:.*]] = call i8* @llvm.frameaddress(i32 0)
+  // AARCH64:   %[[call:.*]] = call i32 @_setjmpex(i8* getelementptr 
inbounds ([1 x i8], [1 x i8]* @jb, i32 0, i32 0), i8* %[[addr]])
+  // AARCH64-NEXT:  ret i32 %[[call]]
 }
 
 int test_setjmpex() {
   return _setjmpex(jb);
   // X64-LABEL: define dso_local i32 @test_setjmpex
   // X64:   %[[addr:.*]] = call i8* @llvm.frameaddress(i32 0)
   // X64:   %[[call:.*]] = call i32 @_setjmpex(i8* getelementptr inbounds 
([1 x i8], [1 x i8]* @jb, i32 0, i32 0), i8* %[[addr]])
   // X64-NEXT:  ret i32 %[[call]]
+
+  // AARCH64-LABEL: define dso_local i32 @test_setjmpex
+  // AARCH64:   %[[addr:.*]] = call i8* @llvm.frameaddress(i32 0)
+  // AARCH64:   %[[call:.*]] = call i32 @_setjmpex(i8* getelementptr 
inbounds ([1 x i8], [1 x i8]* @jb, i32 0, i32 0), i8* %[[addr]])
+  // AARCH64-NEXT:  ret i32 %[[call]]
 }
Index: lib/CodeGen/CGBuiltin.cpp
===
--- lib/CodeGen/CGBuiltin.cpp
+++ lib/CodeGen/CGBuiltin.cpp
@@ -2841,6 +2841,18 @@
 llvm::Value *Count = ConstantInt::get(IntTy, 0);
 llvm::Value *Args[] = {Buf, Count};
 CS = EmitRuntimeCallOrInvoke(SetJmp3, Args);
+  } else if (getTarget().getTriple().getArch() == llvm::Triple::aarch64) {
+llvm::Type *ArgTypes[] = {Int8PtrTy, Int8PtrTy};
+// There is no _setjmp in the ARM64 libvcruntime.lib.
+// _setjmp is promoted to _setjmpex by the Microsoft C++ compiler.
+llvm::Constant *SetJmp = CGM.CreateRuntimeFunction(
+llvm::FunctionType::get(IntTy, ArgTypes, /*isVarArg=*/false),
+"_setjmpex", ReturnsTwiceAttr, /*Local=*/true);
+llvm::Value *FrameAddr =
+Builder.CreateCall(CGM.getIntrinsic(Intrinsic::frameaddress),
+   ConstantInt::get(Int32Ty, 0));
+llvm::Value *Args[] = {Buf, FrameAddr};
+CS = EmitRuntimeCallOrInvoke(SetJmp, Args);
   } else {
 llvm::Type *ArgTypes[] = {Int8PtrTy, Int8PtrTy};
 llvm::Constant *SetJmp = CGM.CreateRuntimeFunction(
@@ -8484,7 +8496,7 @@
   return EmitX86Select(CGF, Ops[4], Ternlog, PassThru);
 }
 
-static Value *EmitX86SExtMask(CodeGenFunction &CGF, Value *Op, 
+static Value *EmitX86SExtMask(CodeGenFunction &CGF, Value *Op,
   llvm::Type *DstTy) {
   unsigned NumberOfElements = DstTy->getVectorNumElements();
   Value *Mask = getMaskVecValue(CGF, Op, NumberOfElements);


Index: test/CodeGen/ms-setjmp.c
===
--- test/CodeGen/ms-setjmp.c
+++ test/CodeGen/ms-setjmp.c
@@ -1,7 +1,9 @@
 // RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple i686-windows-msvc   -emit-llvm %s -o - | FileCheck --check-prefix=I386 %s
 // RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=X64 %s
+// RUN: %clang_cc1 -fms-extensions -DDECLARE_SETJMP -triple aarch64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=AARCH64 %s
 // RUN: %clang_cc1 -fms-extensions -triple i686-windows-msvc   -emit-llvm %s -o - | FileCheck --check-prefix=I386 %s
 // RUN: %clang_cc1 -fms-extensions -triple x86_64-windows-msvc -emit-llvm %s -o - | FileCheck --check-prefix=X64 %s
+// RUN: %clang_cc1 -fms-extensions -triple aarch64-windows-msvc -emit-llvm %s -o - | File

[PATCH] D44087: [msvc] Allow MSVC toolchain driver to find the aarch64 / arm64 cross-compiler.

2018-03-05 Thread Chris January via Phabricator via cfe-commits
arm-chrjan01 created this revision.
arm-chrjan01 added reviewers: zturner, rnk.
Herald added subscribers: cfe-commits, kristof.beyls, rengolin.
arm-chrjan01 added a comment.

I don't have commit access. Please commit after approval.


Starting with the Fall Creators Update, Windows 10 Desktop can run on machines 
that are powered by aarch64 processors.
Microsoft call the aarch64 architecture "arm64". This patch maps 
ArchType::aarch64 to "arm64" to allow the MSVC toolchain driver to find the 
aarch64 / arm64 cross-compiler.


Repository:
  rC Clang

https://reviews.llvm.org/D44087

Files:
  lib/Driver/ToolChains/MSVC.cpp


Index: lib/Driver/ToolChains/MSVC.cpp
===
--- lib/Driver/ToolChains/MSVC.cpp
+++ lib/Driver/ToolChains/MSVC.cpp
@@ -752,6 +752,8 @@
 return "x64";
   case ArchType::arm:
 return "arm";
+  case ArchType::aarch64:
+return "arm64";
   default:
 return "";
   }
@@ -769,6 +771,8 @@
 return "amd64";
   case ArchType::arm:
 return "arm";
+  case ArchType::aarch64:
+return "arm64";
   default:
 return "";
   }
@@ -784,6 +788,8 @@
 return "amd64";
   case ArchType::arm:
 return "arm";
+  case ArchType::aarch64:
+return "arm64";
   default:
 return "";
   }


Index: lib/Driver/ToolChains/MSVC.cpp
===
--- lib/Driver/ToolChains/MSVC.cpp
+++ lib/Driver/ToolChains/MSVC.cpp
@@ -752,6 +752,8 @@
 return "x64";
   case ArchType::arm:
 return "arm";
+  case ArchType::aarch64:
+return "arm64";
   default:
 return "";
   }
@@ -769,6 +771,8 @@
 return "amd64";
   case ArchType::arm:
 return "arm";
+  case ArchType::aarch64:
+return "arm64";
   default:
 return "";
   }
@@ -784,6 +788,8 @@
 return "amd64";
   case ArchType::arm:
 return "arm";
+  case ArchType::aarch64:
+return "arm64";
   default:
 return "";
   }
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D44087: [msvc] Allow MSVC toolchain driver to find the aarch64 / arm64 cross-compiler.

2018-03-05 Thread Chris January via Phabricator via cfe-commits
arm-chrjan01 added a comment.

I don't have commit access. Please commit after approval.


Repository:
  rC Clang

https://reviews.llvm.org/D44087



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits