We keep clang 14 for webrender-wrench for now, because of bug 1789346. Differential Revision: https://phabricator.services.mozilla.com/D155532
257 lines
9.7 KiB
Diff
257 lines
9.7 KiB
Diff
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
|
|
|