[llvm] 7899fe9 - [X86] Reland D71360 Clean up UseInitArray initialization for X86ELFTargetObjectFile

Fāng-ruì Sòng via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 20 22:34:23 PDT 2020


Relanded D71360 with 85c30f3374d9f7f1124241ab09ce377fcb08d24d

The bug has been there for a while.

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.

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.


On Fri, Mar 20, 2020 at 5:51 PM Eric Christopher <echristo at gmail.com> wrote:

> Hi Ray,
>
> I temporarily reverted this as it was causing msan errors. Feel free to
> reach out if you'd like an easy reproduction :)
>
> -eric
>
> On Fri, Mar 20, 2020 at 11:18 AM Fangrui Song via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>>
>> Author: Fangrui Song
>> Date: 2020-03-20T11:18:36-07:00
>> New Revision: 7899fe9da8d8df6f19ddcbbb877ea124d711c54b
>>
>> URL:
>> https://github.com/llvm/llvm-project/commit/7899fe9da8d8df6f19ddcbbb877ea124d711c54b
>> DIFF:
>> https://github.com/llvm/llvm-project/commit/7899fe9da8d8df6f19ddcbbb877ea124d711c54b.diff
>>
>> LOG: [X86] Reland D71360 Clean up UseInitArray initialization for
>> X86ELFTargetObjectFile
>>
>> UseInitArray is now the CC1 default but
>> TargetLoweringObjectFileELF::UseInitArray still defaults to false.
>> The following two unknown OS target triples continue using .ctors/.dtors
>> because InitializeELF is not called.
>>
>> clang -target i386 -c a.c
>> clang -target x86_64 -c a.c
>>
>> This cleanup fixes this as a bonus.
>>
>> Differential Revision: https://reviews.llvm.org/D71360
>>
>> Added:
>>
>>
>> Modified:
>>     llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>>     llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp
>>     llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp
>>     llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp
>>     llvm/lib/Target/Mips/MipsTargetObjectFile.cpp
>>     llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp
>>     llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
>>     llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp
>>     llvm/lib/Target/X86/X86TargetMachine.cpp
>>     llvm/lib/Target/X86/X86TargetObjectFile.cpp
>>     llvm/lib/Target/X86/X86TargetObjectFile.h
>>     llvm/test/CodeGen/X86/constructor.ll
>>     llvm/test/CodeGen/X86/init-priority.ll
>>
>> Removed:
>>
>>
>>
>>
>> ################################################################################
>> diff  --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>> b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>> index 8f1c342202d6..dedb6735b470 100644
>> --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>> +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>> @@ -108,6 +108,7 @@ void
>> TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
>>    TM = &TgtM;
>>
>>    CodeModel::Model CM = TgtM.getCodeModel();
>> +  InitializeELF(TgtM.Options.UseInitArray);
>>
>>    switch (TgtM.getTargetTriple().getArch()) {
>>    case Triple::arm:
>>
>> diff  --git a/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp
>> b/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp
>> index cf049ec274f2..dfc66f0cb4c1 100644
>> --- a/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp
>> +++ b/llvm/lib/Target/AArch64/AArch64TargetObjectFile.cpp
>> @@ -20,7 +20,6 @@ using namespace dwarf;
>>  void AArch64_ELFTargetObjectFile::Initialize(MCContext &Ctx,
>>                                               const TargetMachine &TM) {
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>    // AARCH64 ELF ABI does not define static relocation type for TLS
>> offset
>>    // within a module.  Do not generate AT_location for TLS variables.
>>    SupportDebugThreadLocalLocation = false;
>>
>> diff  --git a/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp
>> b/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp
>> index fdcc41a4ca41..1dc1a783e6da 100644
>> --- a/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp
>> +++ b/llvm/lib/Target/Hexagon/HexagonTargetObjectFile.cpp
>> @@ -112,7 +112,6 @@ static const char *getSectionSuffixForSize(unsigned
>> Size) {
>>  void HexagonTargetObjectFile::Initialize(MCContext &Ctx,
>>        const TargetMachine &TM) {
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>
>>    SmallDataSection =
>>      getContext().getELFSection(".sdata", ELF::SHT_PROGBITS,
>>
>> diff  --git a/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp
>> b/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp
>> index b0f7c090bb8e..d47306c55bad 100644
>> --- a/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp
>> +++ b/llvm/lib/Target/Lanai/LanaiTargetObjectFile.cpp
>> @@ -28,7 +28,6 @@ static cl::opt<unsigned> SSThreshold(
>>  void LanaiTargetObjectFile::Initialize(MCContext &Ctx,
>>                                         const TargetMachine &TM) {
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>
>>    SmallDataSection = getContext().getELFSection(
>>        ".sdata", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
>>
>> diff  --git a/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp
>> b/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp
>> index 0852b5a18c68..ffd7a057bf05 100644
>> --- a/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp
>> +++ b/llvm/lib/Target/Mips/MipsTargetObjectFile.cpp
>> @@ -44,7 +44,6 @@ EmbeddedData("membedded-data", cl::Hidden,
>>
>>  void MipsTargetObjectFile::Initialize(MCContext &Ctx, const
>> TargetMachine &TM){
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>
>>    SmallDataSection = getContext().getELFSection(
>>        ".sdata", ELF::SHT_PROGBITS,
>>
>> diff  --git a/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp
>> b/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp
>> index e237fab1b267..168630f55b24 100644
>> --- a/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp
>> +++ b/llvm/lib/Target/PowerPC/PPCTargetObjectFile.cpp
>> @@ -18,7 +18,6 @@ void
>>  PPC64LinuxTargetObjectFile::
>>  Initialize(MCContext &Ctx, const TargetMachine &TM) {
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>  }
>>
>>  MCSection *PPC64LinuxTargetObjectFile::SelectSectionForGlobal(
>>
>> diff  --git a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
>> b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
>> index bbd45c970d3d..0d1480170fda 100644
>> --- a/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
>> +++ b/llvm/lib/Target/RISCV/RISCVTargetObjectFile.cpp
>> @@ -17,7 +17,6 @@ using namespace llvm;
>>  void RISCVELFTargetObjectFile::Initialize(MCContext &Ctx,
>>                                            const TargetMachine &TM) {
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>
>>    SmallDataSection = getContext().getELFSection(
>>        ".sdata", ELF::SHT_PROGBITS, ELF::SHF_WRITE | ELF::SHF_ALLOC);
>>
>> diff  --git a/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp
>> b/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp
>> index e6ad4d2d67aa..022ee4e9503e 100644
>> --- a/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp
>> +++ b/llvm/lib/Target/Sparc/SparcTargetObjectFile.cpp
>> @@ -17,7 +17,6 @@ using namespace llvm;
>>  void SparcELFTargetObjectFile::Initialize(MCContext &Ctx,
>>                                            const TargetMachine &TM) {
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>  }
>>
>>  const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference(
>>
>> diff  --git a/llvm/lib/Target/X86/X86TargetMachine.cpp
>> b/llvm/lib/Target/X86/X86TargetMachine.cpp
>> index 0cfa7bb04771..0404b4313a02 100644
>> --- a/llvm/lib/Target/X86/X86TargetMachine.cpp
>> +++ b/llvm/lib/Target/X86/X86TargetMachine.cpp
>> @@ -92,19 +92,9 @@ static std::unique_ptr<TargetLoweringObjectFile>
>> createTLOF(const Triple &TT) {
>>      return std::make_unique<TargetLoweringObjectFileMachO>();
>>    }
>>
>> -  if (TT.isOSFreeBSD())
>> -    return std::make_unique<X86FreeBSDTargetObjectFile>();
>> -  if (TT.isOSLinux() || TT.isOSNaCl() || TT.isOSIAMCU())
>> -    return std::make_unique<X86LinuxNaClTargetObjectFile>();
>> -  if (TT.isOSSolaris())
>> -    return std::make_unique<X86SolarisTargetObjectFile>();
>> -  if (TT.isOSFuchsia())
>> -    return std::make_unique<X86FuchsiaTargetObjectFile>();
>> -  if (TT.isOSBinFormatELF())
>> -    return std::make_unique<X86ELFTargetObjectFile>();
>>    if (TT.isOSBinFormatCOFF())
>>      return std::make_unique<TargetLoweringObjectFileCOFF>();
>> -  llvm_unreachable("unknown subtarget type");
>> +  return std::make_unique<X86ELFTargetObjectFile>();
>>  }
>>
>>  static std::string computeDataLayout(const Triple &TT) {
>>
>> diff  --git a/llvm/lib/Target/X86/X86TargetObjectFile.cpp
>> b/llvm/lib/Target/X86/X86TargetObjectFile.cpp
>> index 44185957686b..9096649a2207 100644
>> --- a/llvm/lib/Target/X86/X86TargetObjectFile.cpp
>> +++ b/llvm/lib/Target/X86/X86TargetObjectFile.cpp
>> @@ -64,29 +64,7 @@ const MCExpr
>> *X86ELFTargetObjectFile::getDebugThreadLocalSymbol(
>>    return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_DTPOFF,
>> getContext());
>>  }
>>
>> -void
>> -X86FreeBSDTargetObjectFile::Initialize(MCContext &Ctx,
>> -                                       const TargetMachine &TM) {
>> +void X86ELFTargetObjectFile::Initialize(MCContext &Ctx,
>> +                                        const TargetMachine &TM) {
>>    TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>> -}
>> -
>> -void
>> -X86FuchsiaTargetObjectFile::Initialize(MCContext &Ctx,
>> -                                       const TargetMachine &TM) {
>> -  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>> -}
>> -
>> -void
>> -X86LinuxNaClTargetObjectFile::Initialize(MCContext &Ctx,
>> -                                         const TargetMachine &TM) {
>> -  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>> -}
>> -
>> -void X86SolarisTargetObjectFile::Initialize(MCContext &Ctx,
>> -                                            const TargetMachine &TM) {
>> -  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
>> -  InitializeELF(TM.Options.UseInitArray);
>>  }
>>
>> diff  --git a/llvm/lib/Target/X86/X86TargetObjectFile.h
>> b/llvm/lib/Target/X86/X86TargetObjectFile.h
>> index 1fd0bbf56b19..46d41ccc9b33 100644
>> --- a/llvm/lib/Target/X86/X86TargetObjectFile.h
>> +++ b/llvm/lib/Target/X86/X86TargetObjectFile.h
>> @@ -44,33 +44,11 @@ namespace llvm {
>>      X86ELFTargetObjectFile() {
>>        PLTRelativeVariantKind = MCSymbolRefExpr::VK_PLT;
>>      }
>> -
>> +    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
>>      /// Describe a TLS variable address within debug info.
>>      const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const
>> override;
>>    };
>>
>> -  /// X86FreeBSDTargetObjectFile - This implementation is used for
>> FreeBSD
>> -  /// on x86 and x86-64.
>> -  class X86FreeBSDTargetObjectFile : public X86ELFTargetObjectFile {
>> -    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
>> -  };
>> -
>> -  /// This implementation is used for Fuchsia on x86-64.
>> -  class X86FuchsiaTargetObjectFile : public X86ELFTargetObjectFile {
>> -    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
>> -  };
>> -
>> -  /// X86LinuxNaClTargetObjectFile - This implementation is used for
>> linux and
>> -  /// Native Client on x86 and x86-64.
>> -  class X86LinuxNaClTargetObjectFile : public X86ELFTargetObjectFile {
>> -    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
>> -  };
>> -
>> -  /// This implementation is used for Solaris on x86/x86-64.
>> -  class X86SolarisTargetObjectFile : public X86ELFTargetObjectFile {
>> -    void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
>> -  };
>> -
>>  } // end namespace llvm
>>
>>  #endif
>>
>> diff  --git a/llvm/test/CodeGen/X86/constructor.ll
>> b/llvm/test/CodeGen/X86/constructor.ll
>> index d4518f19b7e6..534c452d6548 100644
>> --- a/llvm/test/CodeGen/X86/constructor.ll
>> +++ b/llvm/test/CodeGen/X86/constructor.ll
>> @@ -1,3 +1,4 @@
>> +; RUN: llc -mtriple x86_64 < %s | FileCheck --check-prefix=INIT-ARRAY %s
>>  ; RUN: llc -mtriple x86_64-pc-linux -use-ctors < %s | FileCheck
>> --check-prefix=CTOR %s
>>  ; RUN: llc -mtriple x86_64-unknown-freebsd -use-ctors < %s | FileCheck
>> --check-prefix=CTOR %s
>>  ; RUN: llc -mtriple x86_64-pc-solaris2.11 -use-ctors < %s | FileCheck
>> --check-prefix=CTOR %s
>>
>> diff  --git a/llvm/test/CodeGen/X86/init-priority.ll
>> b/llvm/test/CodeGen/X86/init-priority.ll
>> index 30e94841f793..47f548cf0238 100644
>> --- a/llvm/test/CodeGen/X86/init-priority.ll
>> +++ b/llvm/test/CodeGen/X86/init-priority.ll
>> @@ -1,4 +1,4 @@
>> -; RUN: llc < %s -mtriple=x86_64-netbsd | FileCheck %s
>> +; RUN: llc < %s -mtriple=x86_64-netbsd -use-ctors | FileCheck %s
>>
>>  ; Check that our compiler never emits global constructors
>>  ; inside the .init_array section when building for a non supported
>> target.
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>

-- 
宋方睿
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200320/aa2c97aa/attachment-0001.html>


More information about the llvm-commits mailing list