Index: llvm/lib/LTO/LTO.cpp =================================================================== --- llvm/lib/LTO/LTO.cpp +++ llvm/lib/LTO/LTO.cpp @@ -567,6 +567,18 @@ GlobalRes.IRName = std::string(Sym.getIRName()); } + // In rare occasion, the symbol used to initialize GlobalRes has a different + // IRName from the inspected Symbol. This can happen on OSX when a symbol + // is referenced through its mangled name, say @"\01_symbol" while the + // IRName is @symbol (the prefix underscore corms from MachO mangling). In + // that case, we have the same actual Symbol that can get two different + // GUID, leading to some invalid internalization. Workaround this by marking + // the GlobalRes external. + if (GlobalRes.IRName != Sym.getIRName()) { + GlobalRes.Partition = GlobalResolution::External; + GlobalRes.VisibleOutsideSummary = true; + } + // Set the partition to external if we know it is re-defined by the linker // with -defsym or -wrap options, used elsewhere, e.g. it is visible to a // regular object, is referenced from llvm.compiler.used/llvm.used, or was Index: llvm/test/LTO/X86/hidden-escaped-symbols-alt.ll =================================================================== --- /dev/null +++ llvm/test/LTO/X86/hidden-escaped-symbols-alt.ll @@ -0,0 +1,39 @@ +; RUN: split-file %s %t +; RUN: opt %t/hide-me.ll -o %t/hide-me.bc +; RUN: opt %t/ref.ll -o %t/ref.bc +; RUN: llvm-lto2 run \ +; RUN: -r %t/hide-me.bc,_hide_me,p \ +; RUN: -r %t/ref.bc,_main,plx \ +; RUN: -r %t/ref.bc,_hide_me,l \ +; RUN: --select-save-temps=precodegen \ +; RUN: -o %t/out \ +; RUN: %t/hide-me.bc %t/ref.bc +; RUN: llvm-dis %t/out.0.5.precodegen.bc -o - | FileCheck %s + + +;--- hide-me.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@"\01_hide_me" = hidden local_unnamed_addr global i8 8, align 1 + +;--- ref.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@hide_me = external local_unnamed_addr global i8 + +define i8 @main() { + %1 = load i8, ptr @hide_me, align 1 + ret i8 %1 +} + + +; CHECK: @"\01_hide_me" = hidden local_unnamed_addr global i8 8, align 1 +; CHECK: @hide_me = external dso_local local_unnamed_addr global i8 + +; CHECK: define dso_local i8 @main() local_unnamed_addr #0 { +; CHECK: %1 = load i8, ptr @hide_me, align 1 +; CHECK: ret i8 %1 +; CHECK: } + Index: llvm/test/LTO/X86/hidden-escaped-symbols.ll =================================================================== --- /dev/null +++ llvm/test/LTO/X86/hidden-escaped-symbols.ll @@ -0,0 +1,39 @@ +; RUN: split-file %s %t +; RUN: opt %t/hide-me.ll -o %t/hide-me.bc +; RUN: opt %t/ref.ll -o %t/ref.bc +; RUN: llvm-lto2 run \ +; RUN: -r %t/hide-me.bc,_hide_me,p \ +; RUN: -r %t/ref.bc,_main,plx \ +; RUN: -r %t/ref.bc,_hide_me,l \ +; RUN: --select-save-temps=precodegen \ +; RUN: -o %t/out \ +; RUN: %t/hide-me.bc %t/ref.bc +; RUN: llvm-dis %t/out.0.5.precodegen.bc -o - | FileCheck %s + + +;--- hide-me.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@hide_me = hidden local_unnamed_addr global i8 8, align 1 + +;--- ref.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@"\01_hide_me" = external local_unnamed_addr global i8 + +define i8 @main() { + %1 = load i8, ptr @"\01_hide_me", align 1 + ret i8 %1 +} + + +; CHECK: @hide_me = hidden local_unnamed_addr global i8 8, align 1 +; CHECK: @"\01_hide_me" = external dso_local local_unnamed_addr global i8 + +; CHECK: define dso_local i8 @main() local_unnamed_addr #0 { +; CHECK: %1 = load i8, ptr @"\01_hide_me", align 1 +; CHECK: ret i8 %1 +; CHECK: } + Index: llvm/test/ThinLTO/X86/hidden-escaped-symbols-alt.ll =================================================================== --- /dev/null +++ llvm/test/ThinLTO/X86/hidden-escaped-symbols-alt.ll @@ -0,0 +1,40 @@ +; RUN: split-file %s %t +; RUN: opt -module-summary %t/hide-me.ll -o %t/hide-me.bc +; RUN: opt -module-summary %t/ref.ll -o %t/ref.bc +; RUN: llvm-lto2 run \ +; RUN: -r %t/hide-me.bc,_hide_me,p \ +; RUN: -r %t/ref.bc,_main,plx \ +; RUN: -r %t/ref.bc,_hide_me,l \ +; RUN: --select-save-temps=precodegen \ +; RUN: -o %t/out \ +; RUN: %t/hide-me.bc %t/ref.bc +; RUN: llvm-dis %t/out.1.5.precodegen.bc -o - | FileCheck --check-prefix=CHECK-HIDE %s +; RUN: llvm-dis %t/out.2.5.precodegen.bc -o - | FileCheck --check-prefix=CHECK-REF %s + + +;--- hide-me.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@"\01_hide_me" = hidden local_unnamed_addr global i8 8, align 1 + +;--- ref.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@hide_me = external local_unnamed_addr global i8 + +define i8 @main() { + %1 = load i8, ptr @hide_me, align 1 + ret i8 %1 +} + + +; CHECK-HIDE: @"\01_hide_me" = hidden local_unnamed_addr global i8 8, align 1 + +; CHECK-REF: @hide_me = external local_unnamed_addr global i8 +; CHECK-REF: define dso_local i8 @main() local_unnamed_addr #0 { +; CHECK-REF: %1 = load i8, ptr @hide_me, align 1 +; CHECK-REF: ret i8 %1 +; CHECK-REF: } + Index: llvm/test/ThinLTO/X86/hidden-escaped-symbols.ll =================================================================== --- /dev/null +++ llvm/test/ThinLTO/X86/hidden-escaped-symbols.ll @@ -0,0 +1,40 @@ +; RUN: split-file %s %t +; RUN: opt -module-summary %t/hide-me.ll -o %t/hide-me.bc +; RUN: opt -module-summary %t/ref.ll -o %t/ref.bc +; RUN: llvm-lto2 run \ +; RUN: -r %t/hide-me.bc,_hide_me,p \ +; RUN: -r %t/ref.bc,_main,plx \ +; RUN: -r %t/ref.bc,_hide_me,l \ +; RUN: --select-save-temps=precodegen \ +; RUN: -o %t/out \ +; RUN: %t/hide-me.bc %t/ref.bc +; RUN: llvm-dis %t/out.1.5.precodegen.bc -o - | FileCheck --check-prefix=CHECK-HIDE %s +; RUN: llvm-dis %t/out.2.5.precodegen.bc -o - | FileCheck --check-prefix=CHECK-REF %s + + +;--- hide-me.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@hide_me = hidden local_unnamed_addr global i8 8, align 1 + +;--- ref.ll +target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.7.0" + +@"\01_hide_me" = external local_unnamed_addr global i8 + +define i8 @main() { + %1 = load i8, ptr @"\01_hide_me", align 1 + ret i8 %1 +} + + +; CHECK-HIDE: @hide_me = hidden local_unnamed_addr global i8 8, align 1 + +; CHECK-REF: @"\01_hide_me" = external local_unnamed_addr global i8 +; CHECK-REF: define dso_local i8 @main() local_unnamed_addr #0 { +; CHECK-REF: %1 = load i8, ptr @"\01_hide_me", align 1 +; CHECK-REF: ret i8 %1 +; CHECK-REF: } +