]> granicus.if.org Git - clang/commitdiff
[COFF, ARM64] Implement llvm.addressofreturnaddress intrinsic
authorMandeep Singh Grang <mgrang@codeaurora.org>
Thu, 1 Nov 2018 01:35:34 +0000 (01:35 +0000)
committerMandeep Singh Grang <mgrang@codeaurora.org>
Thu, 1 Nov 2018 01:35:34 +0000 (01:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@345808 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/BuiltinsAArch64.def
lib/CodeGen/CGBuiltin.cpp
test/CodeGen/ms-intrinsics.c

index 4bf9a702e79c3665ab164508c1dc73026d5735de..44630d417c91c4ce9828dfbc15c3a4d5692a6912 100644 (file)
@@ -121,6 +121,7 @@ TARGET_HEADER_BUILTIN(_ReadWriteBarrier, "v", "nh", "intrin.h", ALL_MS_LANGUAGES
 TARGET_HEADER_BUILTIN(__getReg, "ULLii", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(_ReadStatusReg,  "ii",  "nh", "intrin.h", ALL_MS_LANGUAGES, "")
 TARGET_HEADER_BUILTIN(_WriteStatusReg, "vii", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
+TARGET_HEADER_BUILTIN(_AddressOfReturnAddress, "v*", "nh", "intrin.h", ALL_MS_LANGUAGES, "")
 
 #undef BUILTIN
 #undef LANGBUILTIN
index 4beffd07bbff5f611eaa031b854fb383e6050db6..c67db26711a7d960ad4c7cc22cf753e4bf57b9eb 100644 (file)
@@ -6770,6 +6770,11 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
     return Builder.CreateCall(F, { Metadata, ArgValue });
   }
 
+  if (BuiltinID == AArch64::BI_AddressOfReturnAddress) {
+    llvm::Value *F = CGM.getIntrinsic(Intrinsic::addressofreturnaddress);
+    return Builder.CreateCall(F);
+  }
+
   // Find out if any arguments are required to be integer constant
   // expressions.
   unsigned ICEArguments = 0;
index e8253f47eb0fd9c3d48997604e48616f5c6bd311..51e4616d271d1228836e5f388c2458b3bc364a35 100644 (file)
@@ -137,7 +137,7 @@ void *test_ReturnAddress() {
 // CHECK: = tail call i8* @llvm.returnaddress(i32 0)
 // CHECK: ret i8*
 
-#if defined(__i386__) || defined(__x86_64__)
+#if defined(__i386__) || defined(__x86_64__) || defined (__aarch64__)
 void *test_AddressOfReturnAddress() {
   return _AddressOfReturnAddress();
 }