[PATCH] D18071: CodeGen: Mark runtime functions with reserved names as unnamed_addr.

Peter Collingbourne via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 10 16:50:16 PST 2016


pcc created this revision.
pcc added reviewers: rsmith, rjmccall.
pcc added a subscriber: cfe-commits.

User programs shouldn't be able to observe their addresses without invoking
undefined behavior. This will be needed to create relative references
to runtime functions __cxa_pure_virtual and __cxa_deleted_virtual in the
relative vtable ABI.

http://reviews.llvm.org/D18071

Files:
  lib/CodeGen/CodeGenModule.cpp
  test/CodeGenCXX/dynamic-cast.cpp
  test/CodeGenCXX/exceptions.cpp
  test/CodeGenCXX/runtimecc.cpp

Index: test/CodeGenCXX/runtimecc.cpp
===================================================================
--- test/CodeGenCXX/runtimecc.cpp
+++ test/CodeGenCXX/runtimecc.cpp
@@ -26,7 +26,7 @@
 // CHECK-NEXT: ret void
 }
 
-// CHECK: declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*) [[NOUNWIND]]
+// CHECK: declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*) unnamed_addr [[NOUNWIND]]
 
 namespace test1 {
   void test() {
Index: test/CodeGenCXX/exceptions.cpp
===================================================================
--- test/CodeGenCXX/exceptions.cpp
+++ test/CodeGenCXX/exceptions.cpp
@@ -74,7 +74,7 @@
 
   //   rdar://11904428
   //   Terminate landing pads should call __cxa_begin_catch first.
-  // CHECK:      define linkonce_odr hidden void @__clang_call_terminate(i8*) [[NI_NR_NUW:#[0-9]+]] comdat
+  // CHECK:      define linkonce_odr hidden void @__clang_call_terminate(i8*) unnamed_addr [[NI_NR_NUW:#[0-9]+]] comdat
   // CHECK-NEXT:   [[T0:%.*]] = call i8* @__cxa_begin_catch(i8* %0) [[NUW:#[0-9]+]]
   // CHECK-NEXT:   call void @_ZSt9terminatev() [[NR_NUW:#[0-9]+]]
   // CHECK-NEXT:   unreachable
Index: test/CodeGenCXX/dynamic-cast.cpp
===================================================================
--- test/CodeGenCXX/dynamic-cast.cpp
+++ test/CodeGenCXX/dynamic-cast.cpp
@@ -18,7 +18,7 @@
   return fail;
 }
 
-// CHECK: declare i8* @__dynamic_cast(i8*, i8*, i8*, i64) [[NUW_RO:#[0-9]+]]
+// CHECK: declare i8* @__dynamic_cast(i8*, i8*, i8*, i64) unnamed_addr [[NUW_RO:#[0-9]+]]
 
 // CHECK: attributes [[NUW_RO]] = { nounwind readonly }
 // CHECK: attributes [[NR]] = { noreturn }
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp
+++ lib/CodeGen/CodeGenModule.cpp
@@ -1983,9 +1983,15 @@
   llvm::Constant *C =
       GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(), /*ForVTable=*/false,
                               /*DontDefer=*/false, /*IsThunk=*/false, ExtraAttrs);
-  if (auto *F = dyn_cast<llvm::Function>(C))
+  if (auto *F = dyn_cast<llvm::Function>(C)) {
+    // Mark runtime functions with reserved names as unnamed_addr, as user
+    // programs shouldn't be able to observe their addresses without invoking
+    // undefined behavior.
+    if (Name[0] == '_')
+      F->setUnnamedAddr(true);
     if (F->empty())
       F->setCallingConv(getRuntimeCC());
+  }
   return C;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18071.50377.patch
Type: text/x-patch
Size: 2413 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160311/64a43a51/attachment-0001.bin>


More information about the cfe-commits mailing list