summaryrefslogtreecommitdiffstats
path: root/build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch')
-rw-r--r--build/build-clang/llvmorg-16-init-7778-g232e0a011e8c.patch256
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
+