Teach the internalize pass to skip dllexported symbols because they could be
authorYunzhong Gao <Yunzhong_Gao@playstation.sony.com>
Tue, 3 Dec 2013 18:05:14 +0000 (18:05 +0000)
committerYunzhong Gao <Yunzhong_Gao@playstation.sony.com>
Tue, 3 Dec 2013 18:05:14 +0000 (18:05 +0000)
referenced in a way that even the linker does not see.

Differential Revision: http://llvm-reviews.chandlerc.com/D2280

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196300 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/Internalize.cpp
test/Transforms/Internalize/lists.ll

index 962d3de3156ba9f206b0b222a7241ef44cdca8ec..dae69ce09156d101f27edec25dad50c6958e6f75 100644 (file)
@@ -115,6 +115,10 @@ static bool shouldInternalize(const GlobalValue &GV,
   if (GV.hasAvailableExternallyLinkage())
     return false;
 
+  // Assume that dllexported symbols are referenced elsewhere
+  if (GV.hasDLLExportLinkage())
+    return false;
+
   // Already has internal linkage
   if (GV.hasLocalLinkage())
     return false;
index 83e441a2dfe75493d8934e5c364300e9706f5ce2..637d701524e7f78286a76dbba06bcb5620b9d461 100644 (file)
@@ -48,3 +48,12 @@ define void @foo() {
 define available_externally void @bar() {
   ret void
 }
+
+; ALL: define dllexport void @export_foo() {
+; FOO_AND_J: define dllexport void @export_foo() {
+; FOO_AND_BAR: define dllexport void @export_foo() {
+; FOO_J_AND_BAR: define dllexport void @export_foo() {
+define dllexport void @export_foo() {
+  ret void
+}
+