diff --git a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp --- a/llvm/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/llvm/lib/LTO/ThinLTOCodeGenerator.cpp @@ -275,8 +275,11 @@ DenseSet GUIDPreservedSymbols(PreservedSymbols.size()); for (auto &Entry : PreservedSymbols) { StringRef Name = Entry.first(); + // For MachO object format, symbols are prefixed with "_". For preserved + // symbols "_$NAME", we need to preserve the corresponding GUID for "$NAME" + // and "\01_$NAME". if (TheTriple.isOSBinFormatMachO() && Name.size() > 0 && Name[0] == '_') - Name = Name.drop_front(); + GUIDPreservedSymbols.insert(GlobalValue::getGUID(Name.substr(1))); GUIDPreservedSymbols.insert(GlobalValue::getGUID(Name)); } return GUIDPreservedSymbols; diff --git a/llvm/test/ThinLTO/X86/mangled_symbol.ll b/llvm/test/ThinLTO/X86/mangled_symbol.ll new file mode 100644 --- /dev/null +++ b/llvm/test/ThinLTO/X86/mangled_symbol.ll @@ -0,0 +1,20 @@ +; RUN: opt -module-summary %s -o %t1.bc +; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc +; RUN: llvm-lto -thinlto-action=internalize -thinlto-index %t.index.bc %t1.bc -o - | llvm-dis -o - | FileCheck %s --check-prefix=REGULAR +; RUN: llvm-lto -thinlto-action=internalize -thinlto-index %t.index.bc %t1.bc -o - --exported-symbol=_extern_not_mangled --exported-symbol=_extern_mangled | llvm-dis -o - | FileCheck %s --check-prefix=INTERNALIZE + +; REGULAR: define void @extern_not_mangled +; REGULAR: define void @"\01_extern_mangled" +; INTERNALIZE: define void @extern_not_mangled +; INTERNALIZE: define void @"\01_extern_mangled" + +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.11.0" + +define void @extern_not_mangled() { + ret void +} + +define void @"\01_extern_mangled"() { + ret void +}