diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp --- a/llvm/lib/LTO/LTO.cpp +++ b/llvm/lib/LTO/LTO.cpp @@ -567,6 +567,22 @@ 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 macOS + iOS, when a + // symbol is referenced through its mangled name, say @"\01_symbol" while + // the IRName is @symbol (the prefix underscore comes 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. + + // FIXME: instead of this check, it would be desirable to compute GUIDs + // based on mangled name, but this requires an access to the Target Triple + // and would be relatively invasive on the codebase. + 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 diff --git a/llvm/test/LTO/X86/hidden-escaped-symbols-alt.ll b/llvm/test/LTO/X86/hidden-escaped-symbols-alt.ll new file mode 100644 --- /dev/null +++ b/llvm/test/LTO/X86/hidden-escaped-symbols-alt.ll @@ -0,0 +1,41 @@ +; Check interaction between LTO and LLVM mangling escape char, see #57864. + +; 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: } + diff --git a/llvm/test/LTO/X86/hidden-escaped-symbols.ll b/llvm/test/LTO/X86/hidden-escaped-symbols.ll new file mode 100644 --- /dev/null +++ b/llvm/test/LTO/X86/hidden-escaped-symbols.ll @@ -0,0 +1,41 @@ +; Check interaction between LTO and LLVM mangling escape char, see #57864. + +; 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: } + diff --git a/llvm/test/ThinLTO/X86/hidden-escaped-symbols-alt.ll b/llvm/test/ThinLTO/X86/hidden-escaped-symbols-alt.ll new file mode 100644 --- /dev/null +++ b/llvm/test/ThinLTO/X86/hidden-escaped-symbols-alt.ll @@ -0,0 +1,42 @@ +; Check interaction between LTO and LLVM mangling escape char, see #57864. + +; 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: } + diff --git a/llvm/test/ThinLTO/X86/hidden-escaped-symbols.ll b/llvm/test/ThinLTO/X86/hidden-escaped-symbols.ll new file mode 100644 --- /dev/null +++ b/llvm/test/ThinLTO/X86/hidden-escaped-symbols.ll @@ -0,0 +1,42 @@ +; Check interaction between LTO and LLVM mangling escape char, see #57864. + +; 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: } +