<div dir="ltr"><div dir="ltr">Relanded D71360 with 85c30f3374d9f7f1124241ab09ce377fcb08d24d<br><div><br></div><div>The bug has been there for a while.</div><div><br></div><div>X86LinuxNaClTargetObjectFile was a subclass of X86ELFTargetObjectFile, with a defaulted default constructor. It was zero-initialized (thus MCObjectFileInfo::Env was zeroed (initialized)) but the value was actually incorrect (0: IsMachO). The allocated symbol was MCSymbolMachO:/ Luckily the extra fields of MCSymbolMachO were not accessed.</div><div><br></div><div>AsmPrinter::doInitialization calls TargetLoweringObjectFile::Initialize to initialize MCObjectFileInfo::Env . Several passes (including X86SpeculativeLoadHardeningPass) before AsmPrinter can create MCSymbol (probably not a very good idea?). They happily accessed MCSymbolMachO.... until my re-land deleted X86LinuxNaClTargetObjectFile and thus nullified zero initialization. As a result, MemorySanitizer started to complain.<br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 20, 2020 at 5:51 PM Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi Ray,<div><br></div><div>I temporarily reverted this as it was causing msan errors. Feel free to reach out if you'd like an easy reproduction :)</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Mar 20, 2020 at 11:18 AM Fangrui Song via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Fangrui Song<br>
Date: 2020-03-20T11:18:36-07:00<br>
New Revision: 7899fe9da8d8df6f19ddcbbb877ea124d711c54b<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/7899fe9da8d8df6f19ddcbbb877ea124d711c54b" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/7899fe9da8d8df6f19ddcbbb877ea124d711c54b</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/7899fe9da8d8df6f19ddcbbb877ea124d711c54b.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/7899fe9da8d8df6f19ddcbbb877ea124d711c54b.diff</a><br>
<br>
LOG: [X86] Reland D71360 Clean up UseInitArray initialization for X86ELFTargetObjectFile<br>
<br>
UseInitArray is now the CC1 default but TargetLoweringObjectFileELF::UseInitArray still defaults to false.<br>
The following two unknown OS target triples continue using .ctors/.dtors because InitializeELF is not called.<br>
<br>
clang -target i386 -c a.c<br>
clang -target x86_64 -c a.c<br>
<br>
This cleanup fixes this as a bonus.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D71360" rel="noreferrer" target="_blank">https://reviews.llvm.org/D71360</a><br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
    llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp<br>
    llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp<br>
    llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp<br>
    llvm/lib/Target/Mips/MipsTargetObjectFile.cpp<br>
    llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp<br>
    llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp<br>
    llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp<br>
    llvm/lib/Target/X86/X86TargetMachine.cpp<br>
    llvm/lib/Target/X86/X86TargetObjectFile.cpp<br>
    llvm/lib/Target/X86/X86TargetObjectFile.h<br>
    llvm/test/CodeGen/X86/constructor.ll<br>
    llvm/test/CodeGen/X86/init-priority.ll<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
index 8f1c342202d6..dedb6735b470 100644<br>
--- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
+++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
@@ -108,6 +108,7 @@ void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,<br>
   TM = &TgtM;<br>
<br>
   CodeModel::Model CM = TgtM.getCodeModel();<br>
+  InitializeELF(TgtM.Options.UseInitArray);<br>
<br>
   switch (TgtM.getTargetTriple().getArch()) {<br>
   case Triple::arm:<br>
<br>
diff  --git a/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp b/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp<br>
index cf049ec274f2..dfc66f0cb4c1 100644<br>
--- a/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp<br>
@@ -20,7 +20,6 @@ using namespace dwarf;<br>
 void AArch64_ELFTargetObjectFile::Initialize(MCContext &Ctx,<br>
                                              const TargetMachine &TM) {<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
   // AARCH64 ELF ABI does not define static relocation type for TLS offset<br>
   // within a module.  Do not generate AT_location for TLS variables.<br>
   SupportDebugThreadLocalLocation = false;<br>
<br>
diff  --git a/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp b/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp<br>
index fdcc41a4ca41..1dc1a783e6da 100644<br>
--- a/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp<br>
@@ -112,7 +112,6 @@ static const char *getSectionSuffixForSize(unsigned Size) {<br>
 void HexagonTargetObjectFile::Initialize(MCContext &Ctx,<br>
       const TargetMachine &TM) {<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
<br>
   SmallDataSection =<br>
     getContext().getELFSection(".sdata", ELF::SHT_PROGBITS,<br>
<br>
diff  --git a/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp b/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp<br>
index b0f7c090bb8e..d47306c55bad 100644<br>
--- a/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp<br>
@@ -28,7 +28,6 @@ static cl::opt<unsigned> SSThreshold(<br>
 void LanaiTargetObjectFile::Initialize(MCContext &Ctx,<br>
                                        const TargetMachine &TM) {<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
<br>
   SmallDataSection = getContext().getELFSection(<br>
       ".sdata", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);<br>
<br>
diff  --git a/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp b/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp<br>
index 0852b5a18c68..ffd7a057bf05 100644<br>
--- a/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp<br>
@@ -44,7 +44,6 @@ EmbeddedData("membedded-data", cl::Hidden,<br>
<br>
 void MipsTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM){<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
<br>
   SmallDataSection = getContext().getELFSection(<br>
       ".sdata", ELF::SHT_PROGBITS,<br>
<br>
diff  --git a/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp b/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp<br>
index e237fab1b267..168630f55b24 100644<br>
--- a/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp<br>
@@ -18,7 +18,6 @@ void<br>
 PPC64LinuxTargetObjectFile::<br>
 Initialize(MCContext &Ctx, const TargetMachine &TM) {<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
 }<br>
<br>
 MCSection *PPC64LinuxTargetObjectFile::SelectSectionForGlobal(<br>
<br>
diff  --git a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp<br>
index bbd45c970d3d..0d1480170fda 100644<br>
--- a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp<br>
@@ -17,7 +17,6 @@ using namespace llvm;<br>
 void RISCVELFTargetObjectFile::Initialize(MCContext &Ctx,<br>
                                           const TargetMachine &TM) {<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
<br>
   SmallDataSection = getContext().getELFSection(<br>
       ".sdata", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);<br>
<br>
diff  --git a/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp b/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp<br>
index e6ad4d2d67aa..022ee4e9503e 100644<br>
--- a/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp<br>
@@ -17,7 +17,6 @@ using namespace llvm;<br>
 void SparcELFTargetObjectFile::Initialize(MCContext &Ctx,<br>
                                           const TargetMachine &TM) {<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
 }<br>
<br>
 const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference(<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp<br>
index 0cfa7bb04771..0404b4313a02 100644<br>
--- a/llvm/lib/Target/X86/X86TargetMachine.cpp<br>
+++ b/llvm/lib/Target/X86/X86TargetMachine.cpp<br>
@@ -92,19 +92,9 @@ static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {<br>
     return std::make_unique<TargetLoweringObjectFileMachO>();<br>
   }<br>
<br>
-  if (TT.isOSFreeBSD())<br>
-    return std::make_unique<X86FreeBSDTargetObjectFile>();<br>
-  if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU())<br>
-    return std::make_unique<X86LinuxNaClTargetObjectFile>();<br>
-  if (TT.isOSSolaris())<br>
-    return std::make_unique<X86SolarisTargetObjectFile>();<br>
-  if (TT.isOSFuchsia())<br>
-    return std::make_unique<X86FuchsiaTargetObjectFile>();<br>
-  if (TT.isOSBinFormatELF())<br>
-    return std::make_unique<X86ELFTargetObjectFile>();<br>
   if (TT.isOSBinFormatCOFF())<br>
     return std::make_unique<TargetLoweringObjectFileCOFF>();<br>
-  llvm_unreachable("unknown subtarget type");<br>
+  return std::make_unique<X86ELFTargetObjectFile>();<br>
 }<br>
<br>
 static std::string computeDataLayout(const Triple &TT) {<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86TargetObjectFile.cpp b/llvm/lib/Target/X86/X86TargetObjectFile.cpp<br>
index 44185957686b..9096649a2207 100644<br>
--- a/llvm/lib/Target/X86/X86TargetObjectFile.cpp<br>
+++ b/llvm/lib/Target/X86/X86TargetObjectFile.cpp<br>
@@ -64,29 +64,7 @@ const MCExpr *X86ELFTargetObjectFile::getDebugThreadLocalSymbol(<br>
   return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());<br>
 }<br>
<br>
-void<br>
-X86FreeBSDTargetObjectFile::Initialize(MCContext &Ctx,<br>
-                                       const TargetMachine &TM) {<br>
+void X86ELFTargetObjectFile::Initialize(MCContext &Ctx,<br>
+                                        const TargetMachine &TM) {<br>
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
-}<br>
-<br>
-void<br>
-X86FuchsiaTargetObjectFile::Initialize(MCContext &Ctx,<br>
-                                       const TargetMachine &TM) {<br>
-  TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
-}<br>
-<br>
-void<br>
-X86LinuxNaClTargetObjectFile::Initialize(MCContext &Ctx,<br>
-                                         const TargetMachine &TM) {<br>
-  TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
-}<br>
-<br>
-void X86SolarisTargetObjectFile::Initialize(MCContext &Ctx,<br>
-                                            const TargetMachine &TM) {<br>
-  TargetLoweringObjectFileELF::Initialize(Ctx, TM);<br>
-  InitializeELF(TM.Options.UseInitArray);<br>
 }<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86TargetObjectFile.h b/llvm/lib/Target/X86/X86TargetObjectFile.h<br>
index 1fd0bbf56b19..46d41ccc9b33 100644<br>
--- a/llvm/lib/Target/X86/X86TargetObjectFile.h<br>
+++ b/llvm/lib/Target/X86/X86TargetObjectFile.h<br>
@@ -44,33 +44,11 @@ namespace llvm {<br>
     X86ELFTargetObjectFile() {<br>
       PLTRelativeVariantKind = MCSymbolRefExpr::VK_PLT;<br>
     }<br>
-<br>
+    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;<br>
     /// Describe a TLS variable address within debug info.<br>
     const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const override;<br>
   };<br>
<br>
-  /// X86FreeBSDTargetObjectFile - This implementation is used for FreeBSD<br>
-  /// on x86 and x86-64.<br>
-  class X86FreeBSDTargetObjectFile : public X86ELFTargetObjectFile {<br>
-    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;<br>
-  };<br>
-<br>
-  /// This implementation is used for Fuchsia on x86-64.<br>
-  class X86FuchsiaTargetObjectFile : public X86ELFTargetObjectFile {<br>
-    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;<br>
-  };<br>
-<br>
-  /// X86LinuxNaClTargetObjectFile - This implementation is used for linux and<br>
-  /// Native Client on x86 and x86-64.<br>
-  class X86LinuxNaClTargetObjectFile : public X86ELFTargetObjectFile {<br>
-    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;<br>
-  };<br>
-<br>
-  /// This implementation is used for Solaris on x86/x86-64.<br>
-  class X86SolarisTargetObjectFile : public X86ELFTargetObjectFile {<br>
-    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;<br>
-  };<br>
-<br>
 } // end namespace llvm<br>
<br>
 #endif<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/constructor.ll b/llvm/test/CodeGen/X86/constructor.ll<br>
index d4518f19b7e6..534c452d6548 100644<br>
--- a/llvm/test/CodeGen/X86/constructor.ll<br>
+++ b/llvm/test/CodeGen/X86/constructor.ll<br>
@@ -1,3 +1,4 @@<br>
+; RUN: llc -mtriple x86_64 < %s | FileCheck --check-prefix=INIT-ARRAY %s<br>
 ; RUN: llc -mtriple x86_64-pc-linux -use-ctors < %s | FileCheck --check-prefix=CTOR %s<br>
 ; RUN: llc -mtriple x86_64-unknown-freebsd -use-ctors < %s | FileCheck --check-prefix=CTOR %s<br>
 ; RUN: llc -mtriple x86_64-pc-solaris2.11 -use-ctors < %s | FileCheck --check-prefix=CTOR %s<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/init-priority.ll b/llvm/test/CodeGen/X86/init-priority.ll<br>
index 30e94841f793..47f548cf0238 100644<br>
--- a/llvm/test/CodeGen/X86/init-priority.ll<br>
+++ b/llvm/test/CodeGen/X86/init-priority.ll<br>
@@ -1,4 +1,4 @@<br>
-; RUN: llc < %s -mtriple=x86_64-netbsd | FileCheck %s<br>
+; RUN: llc < %s -mtriple=x86_64-netbsd -use-ctors | FileCheck %s<br>
<br>
 ; Check that our compiler never emits global constructors<br>
 ; inside the .init_array section when building for a non supported target.<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr"><div dir="ltr">宋方睿</div></div>
</div>