diff options
Diffstat (limited to 'build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch')
-rw-r--r-- | build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch b/build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch new file mode 100644 index 0000000000..7719caeb99 --- /dev/null +++ b/build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch @@ -0,0 +1,256 @@ +From e9b4278ca7a492d3710aeae324250189379e6d30 Mon Sep 17 00:00:00 2001 +From: serge-sans-paille <sguelton@redhat.com> +Date: Thu, 13 Oct 2022 10:26:41 +0200 +Subject: [PATCH] [lto] Do not try to internalize symbols with escaped name + +Because of LLVM mangling escape sequence (through '\01' prefix), it is possible +for a single symbols two have two different IR representations. + +For instance, consider @symbol and @"\01_symbol". On OSX, because of the system +mangling rules, these two IR names point are converted in the same final symbol +upon linkage. + +LTO doesn't model this behavior, which may result in symbols being incorrectly +internalized (if all reference use the escaping sequence while the definition +doesn't). + +The proper approach is probably to use the mangled name to compute GUID to +avoid the dual representation, but we can also avoid discarding symbols that are +bound to two different IR names. This is an approximation, but it's less +intrusive on the codebase. + +Fix #57864 + +Differential Revision: https://reviews.llvm.org/D135710 +--- + llvm/lib/LTO/LTO.cpp | 16 +++++++ + .../LTO/X86/hidden-escaped-symbols-alt.ll | 41 ++++++++++++++++++ + llvm/test/LTO/X86/hidden-escaped-symbols.ll | 41 ++++++++++++++++++ + .../ThinLTO/X86/hidden-escaped-symbols-alt.ll | 42 +++++++++++++++++++ + .../ThinLTO/X86/hidden-escaped-symbols.ll | 42 +++++++++++++++++++ + 5 files changed, 182 insertions(+) + create mode 100644 llvm/test/LTO/X86/hidden-escaped-symbols-alt.ll + create mode 100644 llvm/test/LTO/X86/hidden-escaped-symbols.ll + create mode 100644 llvm/test/ThinLTO/X86/hidden-escaped-symbols-alt.ll + create mode 100644 llvm/test/ThinLTO/X86/hidden-escaped-symbols.ll + +diff --git a/llvm/lib/LTO/LTO.cpp b/llvm/lib/LTO/LTO.cpp +index 0f78c4ebd5ca..93aed72b3d15 100644 +--- a/llvm/lib/LTO/LTO.cpp ++++ b/llvm/lib/LTO/LTO.cpp +@@ -565,6 +565,22 @@ void LTO::addModuleToGlobalRes(ArrayRef<InputFile::Symbol> Syms, + 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 +index 000000000000..ca8e7d8eb2b2 +--- /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 +index 000000000000..aec617e25d3d +--- /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 +index 000000000000..dadd1d434256 +--- /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 +index 000000000000..8d0e22f0fd22 +--- /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: } ++ +-- +2.38.1.1.g6d9df9d320 + |