[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