[llvm] r201608 - Fix PR18743.
Daniel Jasper
djasper at google.com
Wed Feb 19 01:56:33 PST 2014
This breaks LTO, specifically the LLVMgold plugin, which starts to
segfault. The problem is that the TargetLoweringObjectFile is used before
being initialized. I'll provide more details in a few minutes.
On Tue, Feb 18, 2014 at 11:24 PM, Rafael Espindola <
rafael.espindola at gmail.com> wrote:
> Author: rafael
> Date: Tue Feb 18 16:24:57 2014
> New Revision: 201608
>
> URL: http://llvm.org/viewvc/llvm-project?rev=201608&view=rev
> Log:
> Fix PR18743.
>
> The IR
> @foo = private constant i32 42
>
> is valid, but before this patch we would produce an invalid MachO from it.
> It
> was invalid because it would use an L label in a section where the liker
> needs
> the labels in order to atomize it.
>
> One way of fixing it would be to just reject this IR in the backend, but
> that
> would not be very front end friendly.
>
> What this patch does is use an 'l' prefix in sections that we know the
> linker
> requires symbols for atomizing them. This allows frontends to just use
> private and not worry about which sections they go to or how the linker
> handles
> them.
>
> One small issue with this strategy is that now a symbol name depends on the
> section, which is not available before codegen. This is not a problem in
> practice. The reason is that it only happens with private linkage, which
> will
> be ignored by the non codegen users (llvm-nm and llvm-ar).
>
> Added:
> llvm/trunk/test/CodeGen/X86/osx-private-labels.ll
> Modified:
> llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> llvm/trunk/include/llvm/IR/Mangler.h
> llvm/trunk/include/llvm/Target/TargetLowering.h
> llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp
> llvm/trunk/lib/CodeGen/TargetLoweringBase.cpp
> llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
> llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> llvm/trunk/lib/IR/Mangler.cpp
> llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> llvm/trunk/lib/LTO/LTOModule.cpp
> llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp
> llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h
> llvm/trunk/lib/Target/PowerPC/PPCMCInstLower.cpp
> llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.cpp
> llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.h
> llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp
> llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp
> llvm/trunk/lib/Target/X86/X86TargetObjectFile.h
> llvm/trunk/lib/Target/XCore/XCoreTargetObjectFile.cpp
> llvm/trunk/test/CodeGen/PowerPC/private.ll
> llvm/trunk/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll
> llvm/trunk/test/CodeGen/X86/pr10420.ll
> llvm/trunk/test/CodeGen/X86/private-2.ll
>
> Modified: llvm/trunk/include/llvm/CodeGen/AsmPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/AsmPrinter.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/AsmPrinter.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/AsmPrinter.h Tue Feb 18 16:24:57 2014
> @@ -161,6 +161,9 @@ namespace llvm {
> /// getCurrentSection() - Return the current section we are emitting
> to.
> const MCSection *getCurrentSection() const;
>
> + void getNameWithPrefix(SmallVectorImpl<char> &Name,
> + const GlobalValue *GV) const;
> +
> MCSymbol *getSymbol(const GlobalValue *GV) const;
>
>
> //===------------------------------------------------------------------===//
>
> Modified: llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> (original)
> +++ llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h Tue Feb
> 18 16:24:57 2014
> @@ -57,14 +57,15 @@ public:
>
> /// Return an MCExpr to use for a reference to the specified type info
> global
> /// variable from exception handling information.
> - const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
> - unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI,
> - MCStreamer &Streamer) const
> + const MCExpr *
> + getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
> + Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI, MCStreamer &Streamer)
> const
> LLVM_OVERRIDE;
>
> // The symbol that gets passed to .cfi_personality.
> MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
> + const TargetMachine &TM,
> MachineModuleInfo *MMI) const
> LLVM_OVERRIDE;
>
> void InitializeELF(bool UseInitArray_);
> @@ -90,6 +91,9 @@ public:
> Mangler &Mang, const TargetMachine &TM) const
> LLVM_OVERRIDE;
>
> + bool isSectionAtomizableBySymbols(const MCSection &Section) const
> + LLVM_OVERRIDE;
> +
> const MCSection *SelectSectionForGlobal(const GlobalValue *GV,
> SectionKind Kind, Mangler &Mang,
> const TargetMachine &TM) const
> @@ -105,18 +109,19 @@ public:
> /// This hook allows targets to selectively decide not to emit the
> /// UsedDirective for some symbols in llvm.used.
> /// FIXME: REMOVE this (rdar://7071300)
> - bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler &Mang)
> const
> - LLVM_OVERRIDE;
> + bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler &Mang,
> + TargetMachine &TM) const LLVM_OVERRIDE;
>
> /// The mach-o version of this method defaults to returning a stub
> reference.
> - const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
> - unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI,
> - MCStreamer &Streamer) const
> + const MCExpr *
> + getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
> + Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI, MCStreamer &Streamer)
> const
> LLVM_OVERRIDE;
>
> // The symbol that gets passed to .cfi_personality.
> MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
> + const TargetMachine &TM,
> MachineModuleInfo *MMI) const
> LLVM_OVERRIDE;
> };
>
>
> Modified: llvm/trunk/include/llvm/IR/Mangler.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Mangler.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Mangler.h (original)
> +++ llvm/trunk/include/llvm/IR/Mangler.h Tue Feb 18 16:24:57 2014
> @@ -51,9 +51,10 @@ public:
> /// Print the appropriate prefix and the specified global variable's
> name.
> /// If the global variable doesn't have a name, this fills in a unique
> name
> /// for the global.
> - void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV) const;
> - void getNameWithPrefix(SmallVectorImpl<char> &OutName,
> - const GlobalValue *GV) const;
> + void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV,
> + bool CannotUsePrivateLabel) const;
> + void getNameWithPrefix(SmallVectorImpl<char> &OutName, const
> GlobalValue *GV,
> + bool CannotUsePrivateLabel) const;
>
> /// Print the appropriate prefix and the specified name as the global
> variable
> /// name. GVName must not be empty.
>
> Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Tue Feb 18 16:24:57
> 2014
> @@ -48,8 +48,10 @@ namespace llvm {
> class MachineFunction;
> class MachineInstr;
> class MachineJumpTableInfo;
> + class Mangler;
> class MCContext;
> class MCExpr;
> + class MCSymbol;
> template<typename T> class SmallVectorImpl;
> class DataLayout;
> class TargetRegisterClass;
> @@ -1335,6 +1337,10 @@ public:
> return LibcallCallingConvs[Call];
> }
>
> + void getNameWithPrefix(SmallVectorImpl<char> &Name, const GlobalValue
> *GV,
> + Mangler &Mang) const;
> + MCSymbol *getSymbol(const GlobalValue *GV, Mangler &Mang) const;
> +
> private:
> const TargetMachine &TM;
> const DataLayout *DL;
>
> Modified: llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Target/TargetLoweringObjectFile.h Tue Feb 18
> 16:24:57 2014
> @@ -71,8 +71,8 @@ public:
> /// This hook allows targets to selectively decide not to emit the
> /// UsedDirective for some symbols in llvm.used.
> /// FIXME: REMOVE this (rdar://7071300)
> - virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
> - Mangler &Mang) const {
> + virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler
> &Mang,
> + TargetMachine &TM) const {
> return GV != 0;
> }
>
> @@ -117,25 +117,22 @@ public:
>
> /// Return an MCExpr to use for a reference to the specified global
> variable
> /// from exception handling information.
> - virtual const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
> - unsigned Encoding,
> - Mangler &Mang,
> - MachineModuleInfo *MMI,
> - MCStreamer &Streamer)
> const;
> -
> - /// Return the MCSymbol for the specified global value. This symbol is
> the
> - /// main label that is the address of the global
> - MCSymbol *getSymbol(const GlobalValue *GV, Mangler &M) const;
> + virtual const MCExpr *
> + getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
> + Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI, MCStreamer &Streamer)
> const;
>
> /// Return the MCSymbol for a private symbol with global value name as
> its
> /// base, with the specified suffix.
> MCSymbol *getSymbolWithGlobalValueBase(const GlobalValue *GV,
> - StringRef Suffix, Mangler &M)
> const;
> + StringRef Suffix, Mangler &Mang,
> + const TargetMachine &TM) const;
>
> // The symbol that gets passed to .cfi_personality.
> - virtual MCSymbol *
> - getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
> - MachineModuleInfo *MMI) const;
> + virtual MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV,
> + Mangler &Mang,
> + const TargetMachine &TM,
> + MachineModuleInfo *MMI) const;
>
> const MCExpr *
> getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
> @@ -157,10 +154,17 @@ public:
> virtual const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym)
> const;
>
> virtual const MCExpr *
> - getExecutableRelativeSymbol(const ConstantExpr *CE, Mangler &Mang)
> const {
> + getExecutableRelativeSymbol(const ConstantExpr *CE, Mangler &Mang,
> + const TargetMachine &TM) const {
> return 0;
> }
>
> + /// \brief True if the section is atomized using the symbols in it.
> + /// This is false if the section is not atomized at all (most ELF
> sections) or
> + /// if it is atomized based on its contents (MachO' __TEXT,__cstring for
> + /// example).
> + virtual bool isSectionAtomizableBySymbols(const MCSection &Section)
> const;
> +
> protected:
> virtual const MCSection *
> SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Feb 18 16:24:57
> 2014
> @@ -311,8 +311,13 @@ void AsmPrinter::EmitLinkage(const Globa
> llvm_unreachable("Unknown linkage type!");
> }
>
> +void AsmPrinter::getNameWithPrefix(SmallVectorImpl<char> &Name,
> + const GlobalValue *GV) const {
> + TM.getTargetLowering()->getNameWithPrefix(Name, GV, *Mang);
> +}
> +
> MCSymbol *AsmPrinter::getSymbol(const GlobalValue *GV) const {
> - return getObjFileLowering().getSymbol(GV, *Mang);
> + return TM.getTargetLowering()->getSymbol(GV, *Mang);
> }
>
> /// EmitGlobalVariable - Emit the specified global variable to the .s
> file.
> @@ -1369,7 +1374,7 @@ void AsmPrinter::EmitLLVMUsedList(const
> for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
> const GlobalValue *GV =
> dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts());
> - if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, *Mang))
> + if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, *Mang,
> TM))
> OutStreamer.EmitSymbolAttribute(getSymbol(GV), MCSA_NoDeadStrip);
> }
> }
> @@ -1574,7 +1579,8 @@ static const MCExpr *lowerConstant(const
> }
>
> if (const MCExpr *RelocExpr =
> - AP.getObjFileLowering().getExecutableRelativeSymbol(CE,
> *AP.Mang))
> + AP.getObjFileLowering().getExecutableRelativeSymbol(CE,
> *AP.Mang,
> + AP.TM))
> return RelocExpr;
>
> switch (CE->getOpcode()) {
> @@ -2103,7 +2109,8 @@ MCSymbol *AsmPrinter::GetJTSetSymbol(uns
>
> MCSymbol *AsmPrinter::getSymbolWithGlobalValueBase(const GlobalValue *GV,
> StringRef Suffix)
> const {
> - return getObjFileLowering().getSymbolWithGlobalValueBase(GV, Suffix,
> *Mang);
> + return getObjFileLowering().getSymbolWithGlobalValueBase(GV, Suffix,
> *Mang,
> + TM);
> }
>
> /// GetExternalSymbolSymbol - Return the MCSymbol for the specified
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinterDwarf.cpp Tue Feb 18
> 16:24:57 2014
> @@ -143,7 +143,7 @@ void AsmPrinter::EmitTTypeReference(cons
> const TargetLoweringObjectFile &TLOF = getObjFileLowering();
>
> const MCExpr *Exp =
> - TLOF.getTTypeGlobalReference(GV, Encoding, *Mang, MMI,
> OutStreamer);
> + TLOF.getTTypeGlobalReference(GV, Encoding, *Mang, TM, MMI,
> OutStreamer);
> OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding));
> } else
> OutStreamer.EmitIntValue(0, GetSizeOfEncodedValue(Encoding));
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp Tue Feb 18
> 16:24:57 2014
> @@ -119,7 +119,8 @@ void DwarfCFIException::beginFunction(co
> if (!shouldEmitPersonality)
> return;
>
> - const MCSymbol *Sym = TLOF.getCFIPersonalitySymbol(Per, *Asm->Mang,
> MMI);
> + const MCSymbol *Sym =
> + TLOF.getCFIPersonalitySymbol(Per, *Asm->Mang, Asm->TM, MMI);
> Asm->OutStreamer.EmitCFIPersonality(Sym, PerEncoding);
>
> Asm->OutStreamer.EmitDebugLabel
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/Win64Exception.cpp Tue Feb 18
> 16:24:57 2014
> @@ -101,7 +101,8 @@ void Win64Exception::endFunction(const M
> if (shouldEmitPersonality) {
> const TargetLoweringObjectFile &TLOF = Asm->getObjFileLowering();
> const Function *Per =
> MMI->getPersonalities()[MMI->getPersonalityIndex()];
> - const MCSymbol *Sym = TLOF.getCFIPersonalitySymbol(Per, *Asm->Mang,
> MMI);
> + const MCSymbol *Sym =
> + TLOF.getCFIPersonalitySymbol(Per, *Asm->Mang, Asm->TM, MMI);
>
> Asm->OutStreamer.PushSection();
> Asm->OutStreamer.EmitWin64EHHandlerData();
>
> Modified: llvm/trunk/lib/CodeGen/TargetLoweringBase.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringBase.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/TargetLoweringBase.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetLoweringBase.cpp Tue Feb 18 16:24:57 2014
> @@ -24,7 +24,9 @@
> #include "llvm/IR/DataLayout.h"
> #include "llvm/IR/DerivedTypes.h"
> #include "llvm/IR/GlobalVariable.h"
> +#include "llvm/IR/Mangler.h"
> #include "llvm/MC/MCAsmInfo.h"
> +#include "llvm/MC/MCContext.h"
> #include "llvm/MC/MCExpr.h"
> #include "llvm/Support/CommandLine.h"
> #include "llvm/Support/ErrorHandling.h"
> @@ -1426,3 +1428,29 @@ bool TargetLoweringBase::isLegalAddressi
>
> return true;
> }
> +
> +void TargetLoweringBase::getNameWithPrefix(SmallVectorImpl<char> &Name,
> + const GlobalValue *GV,
> + Mangler &Mang) const {
> + if (!GV->hasPrivateLinkage()) {
> + // Simple case: If GV is not private, it is not important to find out
> if
> + // private labels are legal in this case or not.
> + Mang.getNameWithPrefix(Name, GV, false);
> + return;
> + }
> + SectionKind GVKind =
> + TargetLoweringObjectFile::getKindForGlobal(GV, getTargetMachine());
> + const TargetLoweringObjectFile &TLOF = getObjFileLowering();
> + const MCSection *TheSection =
> + TLOF.SectionForGlobal(GV, GVKind, Mang, getTargetMachine());
> + bool CannotUsePrivateLabel =
> TLOF.isSectionAtomizableBySymbols(*TheSection);
> + Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel);
> +}
> +
> +MCSymbol *TargetLoweringBase::getSymbol(const GlobalValue *GV,
> + Mangler &Mang) const {
> + SmallString<60> NameStr;
> + getNameWithPrefix(NameStr, GV, Mang);
> + const TargetLoweringObjectFile &TLOF = getObjFileLowering();
> + return TLOF.getContext().GetOrCreateSymbol(NameStr.str());
> +}
>
> Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Tue Feb 18
> 16:24:57 2014
> @@ -36,6 +36,7 @@
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/Target/TargetMachine.h"
> +#include "llvm/Target/TargetLowering.h"
> using namespace llvm;
> using namespace dwarf;
>
> @@ -43,19 +44,18 @@ using namespace dwarf;
> // ELF
>
> //===----------------------------------------------------------------------===//
>
> -MCSymbol *
> -TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue
> *GV,
> - Mangler &Mang,
> - MachineModuleInfo *MMI)
> const {
> +MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol(
> + const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI) const {
> unsigned Encoding = getPersonalityEncoding();
> switch (Encoding & 0x70) {
> default:
> report_fatal_error("We do not support this DWARF encoding yet!");
> case dwarf::DW_EH_PE_absptr:
> - return getSymbol(GV, Mang);
> + return TM.getTargetLowering()->getSymbol(GV, Mang);
> case dwarf::DW_EH_PE_pcrel: {
> return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
> - getSymbol(GV, Mang)->getName());
> + TM.getTargetLowering()->getSymbol(GV,
> Mang)->getName());
> }
> }
> }
> @@ -89,18 +89,19 @@ void TargetLoweringObjectFileELF::emitPe
>
> const MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference(
> const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI, MCStreamer &Streamer) const {
> + const TargetMachine &TM, MachineModuleInfo *MMI,
> + MCStreamer &Streamer) const {
>
> if (Encoding & dwarf::DW_EH_PE_indirect) {
> MachineModuleInfoELF &ELFMMI =
> MMI->getObjFileInfo<MachineModuleInfoELF>();
>
> - MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang);
> + MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang,
> TM);
>
> // Add information about the stub reference to ELFMMI so that the stub
> // gets emitted by the asmprinter.
> MachineModuleInfoImpl::StubValueTy &StubSym =
> ELFMMI.getGVStubEntry(SSym);
> if (StubSym.getPointer() == 0) {
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> StubSym = MachineModuleInfoImpl::StubValueTy(Sym,
> !GV->hasLocalLinkage());
> }
>
> @@ -109,8 +110,8 @@ const MCExpr *TargetLoweringObjectFileEL
> Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
> }
>
> - return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding,
> Mang,
> - MMI, Streamer);
> + return TargetLoweringObjectFile::
> + getTTypeGlobalReference(GV, Encoding, Mang, TM, MMI, Streamer);
> }
>
> static SectionKind
> @@ -195,10 +196,9 @@ getELFSectionFlags(SectionKind K) {
> return Flags;
> }
>
> -
> -const MCSection *TargetLoweringObjectFileELF::
> -getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
> - Mangler &Mang, const TargetMachine &TM) const {
> +const MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal(
> + const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
> + const TargetMachine &TM) const {
> StringRef SectionName = GV->getSection();
>
> // Infer section flags from the section name if we can.
> @@ -248,7 +248,7 @@ SelectSectionForGlobal(const GlobalValue
> Prefix = getSectionPrefixForGlobal(Kind);
>
> SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> Name.append(Sym->getName().begin(), Sym->getName().end());
> StringRef Group = "";
> unsigned Flags = getELFSectionFlags(Kind);
> @@ -487,9 +487,9 @@ emitModuleFlags(MCStreamer &Streamer,
> Streamer.AddBlankLine();
> }
>
> -const MCSection *TargetLoweringObjectFileMachO::
> -getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
> - Mangler &Mang, const TargetMachine &TM) const {
> +const MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
> + const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
> + const TargetMachine &TM) const {
> // Parse the section specifier and create it if valid.
> StringRef Segment, Section;
> unsigned TAA = 0, StubSize = 0;
> @@ -526,6 +526,41 @@ getExplicitSectionGlobal(const GlobalVal
> return S;
> }
>
> +bool TargetLoweringObjectFileMachO::isSectionAtomizableBySymbols(
> + const MCSection &Section) const {
> + const MCSectionMachO &SMO = static_cast<const
> MCSectionMachO&>(Section);
> +
> + // Sections holding 1 byte strings are atomized based on the data
> + // they contain.
> + // Sections holding 2 byte strings require symbols in order to be
> + // atomized.
> + // There is no dedicated section for 4 byte strings.
> + if (SMO.getKind().isMergeable1ByteCString())
> + return false;
> +
> + if (SMO.getSegmentName() == "__DATA" &&
> + SMO.getSectionName() == "__cfstring")
> + return false;
> +
> + switch (SMO.getType()) {
> + default:
> + return true;
> +
> + // These sections are atomized at the element boundaries without
> using
> + // symbols.
> + case MCSectionMachO::S_4BYTE_LITERALS:
> + case MCSectionMachO::S_8BYTE_LITERALS:
> + case MCSectionMachO::S_16BYTE_LITERALS:
> + case MCSectionMachO::S_LITERAL_POINTERS:
> + case MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS:
> + case MCSectionMachO::S_LAZY_SYMBOL_POINTERS:
> + case MCSectionMachO::S_MOD_INIT_FUNC_POINTERS:
> + case MCSectionMachO::S_MOD_TERM_FUNC_POINTERS:
> + case MCSectionMachO::S_INTERPOSING:
> + return false;
> + }
> +}
> +
> const MCSection *TargetLoweringObjectFileMachO::
> SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
> Mangler &Mang, const TargetMachine &TM) const {
> @@ -606,21 +641,17 @@ TargetLoweringObjectFileMachO::getSectio
> return ReadOnlySection; // .const
> }
>
> -/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively
> decide
> -/// not to emit the UsedDirective for some symbols in llvm.used.
> +/// This hook allows targets to selectively decide not to emit the
> UsedDirective
> +/// for some symbols in llvm.used.
> // FIXME: REMOVE this (rdar://7071300)
> -bool TargetLoweringObjectFileMachO::
> -shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler &Mang) const {
> - /// On Darwin, internally linked data beginning with "L" or "l" does
> not have
> - /// the directive emitted (this occurs in ObjC metadata).
> - if (!GV) return false;
> -
> +bool TargetLoweringObjectFileMachO::shouldEmitUsedDirectiveFor(
> + const GlobalValue *GV, Mangler &Mang, TargetMachine &TM) const {
> // Check whether the mangled name has the "Private" or "LinkerPrivate"
> prefix.
> if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
> // FIXME: ObjC metadata is currently emitted as internal symbols that
> have
> // \1L and \0l prefixes on them. Fix them to be
> Private/LinkerPrivate and
> // this horrible hack can go away.
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
> return false;
> }
> @@ -630,14 +661,16 @@ shouldEmitUsedDirectiveFor(const GlobalV
>
> const MCExpr *TargetLoweringObjectFileMachO::getTTypeGlobalReference(
> const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI, MCStreamer &Streamer) const {
> + const TargetMachine &TM, MachineModuleInfo *MMI,
> + MCStreamer &Streamer) const {
> // The mach-o version of this method defaults to returning a stub
> reference.
>
> if (Encoding & DW_EH_PE_indirect) {
> MachineModuleInfoMachO &MachOMMI =
> MMI->getObjFileInfo<MachineModuleInfoMachO>();
>
> - MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr",
> Mang);
> + MCSymbol *SSym =
> + getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM);
>
> // Add information about the stub reference to MachOMMI so that the
> stub
> // gets emitted by the asmprinter.
> @@ -645,7 +678,7 @@ const MCExpr *TargetLoweringObjectFileMa
> GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) :
> MachOMMI.getGVStubEntry(SSym);
> if (StubSym.getPointer() == 0) {
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> StubSym = MachineModuleInfoImpl::StubValueTy(Sym,
> !GV->hasLocalLinkage());
> }
>
> @@ -654,24 +687,24 @@ const MCExpr *TargetLoweringObjectFileMa
> Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
> }
>
> - return TargetLoweringObjectFile::
> - getTTypeGlobalReference(GV, Encoding, Mang, MMI, Streamer);
> + return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding,
> Mang,
> + TM, MMI,
> Streamer);
> }
>
> -MCSymbol *TargetLoweringObjectFileMachO::
> -getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
> - MachineModuleInfo *MMI) const {
> +MCSymbol *TargetLoweringObjectFileMachO::getCFIPersonalitySymbol(
> + const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI) const {
> // The mach-o version of this method defaults to returning a stub
> reference.
> MachineModuleInfoMachO &MachOMMI =
> MMI->getObjFileInfo<MachineModuleInfoMachO>();
>
> - MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr",
> Mang);
> + MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr",
> Mang, TM);
>
> // Add information about the stub reference to MachOMMI so that the stub
> // gets emitted by the asmprinter.
> MachineModuleInfoImpl::StubValueTy &StubSym =
> MachOMMI.getGVStubEntry(SSym);
> if (StubSym.getPointer() == 0) {
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> StubSym = MachineModuleInfoImpl::StubValueTy(Sym,
> !GV->hasLocalLinkage());
> }
>
> @@ -717,9 +750,9 @@ getCOFFSectionFlags(SectionKind K) {
> return Flags;
> }
>
> -const MCSection *TargetLoweringObjectFileCOFF::
> -getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
> - Mangler &Mang, const TargetMachine &TM) const {
> +const MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
> + const GlobalValue *GV, SectionKind Kind, Mangler &Mang,
> + const TargetMachine &TM) const {
> int Selection = 0;
> unsigned Characteristics = getCOFFSectionFlags(Kind);
> StringRef Name = GV->getSection();
> @@ -727,7 +760,7 @@ getExplicitSectionGlobal(const GlobalVal
> if (GV->isWeakForLinker()) {
> Selection = COFF::IMAGE_COMDAT_SELECT_ANY;
> Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> COMDATSymName = Sym->getName();
> }
> return getContext().getCOFFSection(Name,
> @@ -761,7 +794,7 @@ SelectSectionForGlobal(const GlobalValue
> unsigned Characteristics = getCOFFSectionFlags(Kind);
>
> Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> return getContext().getCOFFSection(Name, Characteristics,
> Kind, Sym->getName(),
> COFF::IMAGE_COMDAT_SELECT_ANY);
>
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Tue Feb 18 16:24:57 2014
> @@ -27,6 +27,7 @@
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/MemoryBuffer.h"
> #include "llvm/Support/MutexGuard.h"
> +#include "llvm/Target/TargetLowering.h"
>
> using namespace llvm;
>
> @@ -371,7 +372,7 @@ void *MCJIT::getPointerToFunction(Functi
> // load address of the symbol, not the local address.
> Mangler Mang(TM->getDataLayout());
> SmallString<128> Name;
> - Mang.getNameWithPrefix(Name, F);
> + TM->getTargetLowering()->getNameWithPrefix(Name, F, Mang);
> return (void*)Dyld.getSymbolLoadAddress(Name);
> }
>
>
> Modified: llvm/trunk/lib/IR/Mangler.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Mangler.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/IR/Mangler.cpp (original)
> +++ llvm/trunk/lib/IR/Mangler.cpp Tue Feb 18 16:24:57 2014
> @@ -76,12 +76,18 @@ static void AddFastCallStdCallSuffix(raw
> OS << '@' << ArgWords;
> }
>
> -void Mangler::getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV)
> const {
> +void Mangler::getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV,
> + bool CannotUsePrivateLabel) const {
> ManglerPrefixTy PrefixTy = Mangler::Default;
> - if (GV->hasPrivateLinkage())
> - PrefixTy = Mangler::Private;
> - else if (GV->hasLinkerPrivateLinkage() ||
> GV->hasLinkerPrivateWeakLinkage())
> + if (GV->hasPrivateLinkage()) {
> + if (CannotUsePrivateLabel)
> + PrefixTy = Mangler::LinkerPrivate;
> + else
> + PrefixTy = Mangler::Private;
> + } else if (GV->hasLinkerPrivateLinkage() ||
> + GV->hasLinkerPrivateWeakLinkage()) {
> PrefixTy = Mangler::LinkerPrivate;
> + }
>
> if (!GV->hasName()) {
> // Get the ID for the global, assigning a new one if we haven't got
> one
> @@ -134,7 +140,8 @@ void Mangler::getNameWithPrefix(raw_ostr
> }
>
> void Mangler::getNameWithPrefix(SmallVectorImpl<char> &OutName,
> - const GlobalValue *GV) const {
> + const GlobalValue *GV,
> + bool CannotUsePrivateLabel) const {
> raw_svector_ostream OS(OutName);
> - getNameWithPrefix(OS, GV);
> + getNameWithPrefix(OS, GV, CannotUsePrivateLabel);
> }
>
> Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
> +++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Tue Feb 18 16:24:57 2014
> @@ -336,7 +336,7 @@ applyRestriction(GlobalValue &GV,
> SmallPtrSet<GlobalValue*, 8> &AsmUsed,
> Mangler &Mangler) {
> SmallString<64> Buffer;
> - Mangler.getNameWithPrefix(Buffer, &GV);
> + TargetMach->getTargetLowering()->getNameWithPrefix(Buffer, &GV,
> Mangler);
>
> if (GV.isDeclaration())
> return;
>
> Modified: llvm/trunk/lib/LTO/LTOModule.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOModule.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/LTO/LTOModule.cpp (original)
> +++ llvm/trunk/lib/LTO/LTOModule.cpp Tue Feb 18 16:24:57 2014
> @@ -381,7 +381,7 @@ void LTOModule::addDefinedSymbol(const G
>
> // string is owned by _defines
> SmallString<64> Buffer;
> - _mangler.getNameWithPrefix(Buffer, def);
> + _target->getTargetLowering()->getNameWithPrefix(Buffer, def, _mangler);
>
> // set alignment part log2() can have rounding errors
> uint32_t align = def->getAlignment();
> @@ -517,7 +517,7 @@ LTOModule::addPotentialUndefinedSymbol(c
> return;
>
> SmallString<64> name;
> - _mangler.getNameWithPrefix(name, decl);
> + _target->getTargetLowering()->getNameWithPrefix(name, decl, _mangler);
>
> StringMap<NameAndAttributes>::value_type &entry =
> _undefines.GetOrCreateValue(name);
>
> Modified: llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp Tue Feb 18 16:24:57
> 2014
> @@ -16,7 +16,7 @@
> #include "llvm/MC/MCSectionELF.h"
> #include "llvm/Support/Dwarf.h"
> #include "llvm/Support/ELF.h"
> -#include "llvm/Target/TargetMachine.h"
> +#include "llvm/Target/TargetLowering.h"
> using namespace llvm;
> using namespace dwarf;
>
> @@ -43,12 +43,12 @@ void ARMElfTargetObjectFile::Initialize(
>
> const MCExpr *ARMElfTargetObjectFile::getTTypeGlobalReference(
> const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI, MCStreamer &Streamer) const {
> + const TargetMachine &TM, MachineModuleInfo *MMI,
> + MCStreamer &Streamer) const {
> assert(Encoding == DW_EH_PE_absptr && "Can handle absptr encoding
> only");
>
> - return MCSymbolRefExpr::Create(getSymbol(GV, Mang),
> - MCSymbolRefExpr::VK_ARM_TARGET2,
> - getContext());
> + return MCSymbolRefExpr::Create(TM.getTargetLowering()->getSymbol(GV,
> Mang),
> + MCSymbolRefExpr::VK_ARM_TARGET2,
> getContext());
> }
>
> const MCExpr *ARMElfTargetObjectFile::
>
> Modified: llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h (original)
> +++ llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h Tue Feb 18 16:24:57
> 2014
> @@ -28,10 +28,10 @@ public:
>
> void Initialize(MCContext &Ctx, const TargetMachine &TM) LLVM_OVERRIDE;
>
> - const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
> - unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI,
> - MCStreamer &Streamer) const
> + const MCExpr *
> + getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
> + Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI, MCStreamer &Streamer)
> const
> LLVM_OVERRIDE;
>
> /// \brief Describe a TLS variable address within debug info.
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCMCInstLower.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCMCInstLower.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCMCInstLower.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCMCInstLower.cpp Tue Feb 18 16:24:57
> 2014
> @@ -25,7 +25,8 @@
> #include "llvm/MC/MCAsmInfo.h"
> #include "llvm/MC/MCExpr.h"
> #include "llvm/MC/MCInst.h"
> -#include "llvm/Target/TargetMachine.h"
> +#include "llvm/Target/TargetLowering.h"
> +#include "llvm/Target/TargetLoweringObjectFile.h"
> using namespace llvm;
>
> static MachineModuleInfoMachO &getMachOMMI(AsmPrinter &AP) {
> @@ -34,7 +35,9 @@ static MachineModuleInfoMachO &getMachOM
>
>
> static MCSymbol *GetSymbolFromOperand(const MachineOperand &MO,
> AsmPrinter &AP){
> - const DataLayout *DL = AP.TM.getDataLayout();
> + const TargetMachine &TM = AP.TM;
> + Mangler *Mang = AP.Mang;
> + const DataLayout *DL = TM.getDataLayout();
> MCContext &Ctx = AP.OutContext;
>
> SmallString<128> Name;
> @@ -51,10 +54,10 @@ static MCSymbol *GetSymbolFromOperand(co
>
> if (!MO.isGlobal()) {
> assert(MO.isSymbol() && "Isn't a symbol reference");
> - AP.Mang->getNameWithPrefix(Name, MO.getSymbolName());
> + Mang->getNameWithPrefix(Name, MO.getSymbolName());
> } else {
> const GlobalValue *GV = MO.getGlobal();
> - AP.Mang->getNameWithPrefix(Name, GV);
> + TM.getTargetLowering()->getNameWithPrefix(Name, GV, *Mang);
> }
>
> unsigned OrigLen = Name.size() - PrefixLen;
>
> Modified: llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.cpp (original)
> +++ llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.cpp Tue Feb 18
> 16:24:57 2014
> @@ -11,23 +11,25 @@
> #include "MCTargetDesc/SparcMCExpr.h"
> #include "llvm/CodeGen/MachineModuleInfoImpls.h"
> #include "llvm/Support/Dwarf.h"
> +#include "llvm/Target/TargetLowering.h"
>
> using namespace llvm;
>
> const MCExpr *SparcELFTargetObjectFile::getTTypeGlobalReference(
> const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI, MCStreamer &Streamer) const {
> + const TargetMachine &TM, MachineModuleInfo *MMI,
> + MCStreamer &Streamer) const {
>
> if (Encoding & dwarf::DW_EH_PE_pcrel) {
> MachineModuleInfoELF &ELFMMI =
> MMI->getObjFileInfo<MachineModuleInfoELF>();
>
> - MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang);
> + MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang,
> TM);
>
> // Add information about the stub reference to ELFMMI so that the stub
> // gets emitted by the asmprinter.
> MachineModuleInfoImpl::StubValueTy &StubSym =
> ELFMMI.getGVStubEntry(SSym);
> if (StubSym.getPointer() == 0) {
> - MCSymbol *Sym = getSymbol(GV, Mang);
> + MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> StubSym = MachineModuleInfoImpl::StubValueTy(Sym,
> !GV->hasLocalLinkage());
> }
>
> @@ -37,5 +39,5 @@ const MCExpr *SparcELFTargetObjectFile::
> }
>
> return TargetLoweringObjectFileELF::getTTypeGlobalReference(
> - GV, Encoding, Mang, MMI, Streamer);
> + GV, Encoding, Mang, TM, MMI, Streamer);
> }
>
> Modified: llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.h (original)
> +++ llvm/trunk/lib/Target/Sparc/SparcTargetObjectFile.h Tue Feb 18
> 16:24:57 2014
> @@ -23,10 +23,10 @@ public:
> TargetLoweringObjectFileELF()
> {}
>
> - const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
> - unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI,
> - MCStreamer &Streamer) const
> + const MCExpr *
> + getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
> + Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI, MCStreamer &Streamer)
> const
> LLVM_OVERRIDE;
> };
>
>
> Modified: llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp (original)
> +++ llvm/trunk/lib/Target/TargetLoweringObjectFile.cpp Tue Feb 18 16:24:57
> 2014
> @@ -28,6 +28,7 @@
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/Target/TargetMachine.h"
> +#include "llvm/Target/TargetLowering.h"
> #include "llvm/Target/TargetOptions.h"
> using namespace llvm;
>
> @@ -99,30 +100,22 @@ static bool IsNullTerminatedString(const
> return false;
> }
>
> -/// Return the MCSymbol for the specified global value. This
> -/// symbol is the main label that is the address of the global.
> -MCSymbol *TargetLoweringObjectFile::getSymbol(const GlobalValue *GV,
> - Mangler &M) const {
> - SmallString<60> NameStr;
> - M.getNameWithPrefix(NameStr, GV);
> - return Ctx->GetOrCreateSymbol(NameStr.str());
> -}
> -
> MCSymbol *TargetLoweringObjectFile::getSymbolWithGlobalValueBase(
> - const GlobalValue *GV, StringRef Suffix, Mangler &M) const {
> + const GlobalValue *GV, StringRef Suffix, Mangler &Mang,
> + const TargetMachine &TM) const {
> assert(!Suffix.empty());
>
> SmallString<60> NameStr;
> NameStr += DL->getPrivateGlobalPrefix();
> - M.getNameWithPrefix(NameStr, GV);
> + TM.getTargetLowering()->getNameWithPrefix(NameStr, GV, Mang);
> NameStr.append(Suffix.begin(), Suffix.end());
> return Ctx->GetOrCreateSymbol(NameStr.str());
> }
>
> -MCSymbol *TargetLoweringObjectFile::
> -getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
> - MachineModuleInfo *MMI) const {
> - return getSymbol(GV, Mang);
> +MCSymbol *TargetLoweringObjectFile::getCFIPersonalitySymbol(
> + const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI) const {
> + return TM.getTargetLowering()->getSymbol(GV, Mang);
> }
>
> void TargetLoweringObjectFile::emitPersonalityValue(MCStreamer &Streamer,
> @@ -275,6 +268,10 @@ SectionForGlobal(const GlobalValue *GV,
> return SelectSectionForGlobal(GV, Kind, Mang, TM);
> }
>
> +bool TargetLoweringObjectFile::isSectionAtomizableBySymbols(
> + const MCSection &Section) const {
> + return false;
> +}
>
> // Lame default implementation. Calculate the section name for global.
> const MCSection *
> @@ -312,9 +309,11 @@ TargetLoweringObjectFile::getSectionForC
> /// handling information.
> const MCExpr *TargetLoweringObjectFile::getTTypeGlobalReference(
> const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI, MCStreamer &Streamer) const {
> + const TargetMachine &TM, MachineModuleInfo *MMI,
> + MCStreamer &Streamer) const {
> const MCSymbolRefExpr *Ref =
> - MCSymbolRefExpr::Create(getSymbol(GV, Mang), getContext());
> + MCSymbolRefExpr::Create(TM.getTargetLowering()->getSymbol(GV, Mang),
> + getContext());
>
> return getTTypeReference(Ref, Encoding, Streamer);
> }
>
> Modified: llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86MCInstLower.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86MCInstLower.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86MCInstLower.cpp Tue Feb 18 16:24:57 2014
> @@ -98,7 +98,7 @@ GetSymbolFromOperand(const MachineOperan
>
> if (MO.isGlobal()) {
> const GlobalValue *GV = MO.getGlobal();
> - getMang()->getNameWithPrefix(Name, GV);
> + AsmPrinter.getNameWithPrefix(Name, GV);
> } else if (MO.isSymbol()) {
> getMang()->getNameWithPrefix(Name, MO.getSymbolName());
> } else if (MO.isMBB()) {
>
> Modified: llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86TargetObjectFile.cpp Tue Feb 18 16:24:57
> 2014
> @@ -14,18 +14,20 @@
> #include "llvm/MC/MCExpr.h"
> #include "llvm/MC/MCSectionELF.h"
> #include "llvm/Support/Dwarf.h"
> +#include "llvm/Target/TargetLowering.h"
>
> using namespace llvm;
> using namespace dwarf;
>
> const MCExpr *X86_64MachoTargetObjectFile::getTTypeGlobalReference(
> const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
> - MachineModuleInfo *MMI, MCStreamer &Streamer) const {
> + const TargetMachine &TM, MachineModuleInfo *MMI,
> + MCStreamer &Streamer) const {
>
> // On Darwin/X86-64, we can reference dwarf symbols with foo at GOTPCREL+4,
> which
> // is an indirect pc-relative reference.
> if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) {
> - const MCSymbol *Sym = getSymbol(GV, Mang);
> + const MCSymbol *Sym = TM.getTargetLowering()->getSymbol(GV, Mang);
> const MCExpr *Res =
> MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL,
> getContext());
> const MCExpr *Four = MCConstantExpr::Create(4, getContext());
> @@ -33,13 +35,13 @@ const MCExpr *X86_64MachoTargetObjectFil
> }
>
> return TargetLoweringObjectFileMachO::getTTypeGlobalReference(
> - GV, Encoding, Mang, MMI, Streamer);
> + GV, Encoding, Mang, TM, MMI, Streamer);
> }
>
> -MCSymbol *X86_64MachoTargetObjectFile::
> -getCFIPersonalitySymbol(const GlobalValue *GV, Mangler &Mang,
> - MachineModuleInfo *MMI) const {
> - return getSymbol(GV, Mang);
> +MCSymbol *X86_64MachoTargetObjectFile::getCFIPersonalitySymbol(
> + const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI) const {
> + return TM.getTargetLowering()->getSymbol(GV, Mang);
> }
>
> void
> @@ -54,9 +56,8 @@ X86LinuxTargetObjectFile::getDebugThread
> return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_DTPOFF,
> getContext());
> }
>
> -const MCExpr *
> -X86WindowsTargetObjectFile::getExecutableRelativeSymbol(const
> ConstantExpr *CE,
> - Mangler &Mang)
> const {
> +const MCExpr *X86WindowsTargetObjectFile::getExecutableRelativeSymbol(
> + const ConstantExpr *CE, Mangler &Mang, const TargetMachine &TM) const
> {
> // We are looking for the difference of two symbols, need a subtraction
> // operation.
> const SubOperator *Sub = dyn_cast<SubOperator>(CE);
> @@ -101,6 +102,7 @@ X86WindowsTargetObjectFile::getExecutabl
> if (GVLHS->isThreadLocal())
> return 0;
>
> - return MCSymbolRefExpr::Create(
> - getSymbol(GVLHS, Mang), MCSymbolRefExpr::VK_COFF_IMGREL32,
> getContext());
> + return MCSymbolRefExpr::Create(TM.getTargetLowering()->getSymbol(GVLHS,
> Mang),
> + MCSymbolRefExpr::VK_COFF_IMGREL32,
> + getContext());
> }
>
> Modified: llvm/trunk/lib/Target/X86/X86TargetObjectFile.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86TargetObjectFile.h?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86TargetObjectFile.h (original)
> +++ llvm/trunk/lib/Target/X86/X86TargetObjectFile.h Tue Feb 18 16:24:57
> 2014
> @@ -20,15 +20,16 @@ namespace llvm {
> /// x86-64.
> class X86_64MachoTargetObjectFile : public
> TargetLoweringObjectFileMachO {
> public:
> - const MCExpr *getTTypeGlobalReference(const GlobalValue *GV,
> - unsigned Encoding, Mangler
> &Mang,
> - MachineModuleInfo *MMI,
> - MCStreamer &Streamer) const
> + const MCExpr *
> + getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding,
> + Mangler &Mang, const TargetMachine &TM,
> + MachineModuleInfo *MMI, MCStreamer &Streamer)
> const
> LLVM_OVERRIDE;
>
> // getCFIPersonalitySymbol - The symbol that gets passed to
> // .cfi_personality.
> MCSymbol *getCFIPersonalitySymbol(const GlobalValue *GV, Mangler
> &Mang,
> + const TargetMachine &TM,
> MachineModuleInfo *MMI) const
> LLVM_OVERRIDE;
> };
> @@ -46,7 +47,8 @@ namespace llvm {
> /// \brief This implementation is used for Windows targets on x86 and
> x86-64.
> class X86WindowsTargetObjectFile : public TargetLoweringObjectFileCOFF {
> const MCExpr *getExecutableRelativeSymbol(const ConstantExpr *CE,
> - Mangler &Mang) const
> + Mangler &Mang,
> + const TargetMachine &TM)
> const
> LLVM_OVERRIDE;
> };
>
>
> Modified: llvm/trunk/lib/Target/XCore/XCoreTargetObjectFile.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/XCore/XCoreTargetObjectFile.cpp?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/XCore/XCoreTargetObjectFile.cpp (original)
> +++ llvm/trunk/lib/Target/XCore/XCoreTargetObjectFile.cpp Tue Feb 18
> 16:24:57 2014
> @@ -118,9 +118,10 @@ static unsigned getXCoreSectionFlags(Sec
> return Flags;
> }
>
> -const MCSection *XCoreTargetObjectFile::
> -getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
> - Mangler &Mang, const TargetMachine &TM) const {
> +const MCSection *
> +XCoreTargetObjectFile::getExplicitSectionGlobal(const GlobalValue *GV,
> + SectionKind Kind, Mangler
> &Mang,
> + const TargetMachine &TM)
> const {
> StringRef SectionName = GV->getSection();
> // Infer section flags from the section name if we can.
> bool IsCPRel = SectionName.startswith(".cp.");
>
> Modified: llvm/trunk/test/CodeGen/PowerPC/private.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/private.ll?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/PowerPC/private.ll (original)
> +++ llvm/trunk/test/CodeGen/PowerPC/private.ll Tue Feb 18 16:24:57 2014
> @@ -7,22 +7,22 @@
> ; RUN: FileCheck --check-prefix=OSX %s
>
> ; LINUX: .Lfoo:
> -; OSX: L_foo:
> +; OSX: l_foo:
> define private void @foo() nounwind {
> ret void
> }
>
> define i32 @bar() nounwind {
> ; LINUX: bl{{.*}}.Lfoo
> -; OSX: bl{{.*}}L_foo
> +; OSX: bl{{.*}}l_foo
> call void @foo()
>
> ; LINUX: lis{{.*}}.Lbaz
> -; OSX: lis{{.*}}L_baz
> +; OSX: lis{{.*}}l_baz
> %1 = load i32* @baz, align 4
> ret i32 %1
> }
>
> ; LINUX: .Lbaz:
> -; OSX: L_baz:
> +; OSX: l_baz:
> @baz = private global i32 4
>
> Modified: llvm/trunk/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/2009-11-16-UnfoldMemOpBug.ll Tue Feb 18
> 16:24:57 2014
> @@ -1,7 +1,7 @@
> ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7 | FileCheck %s
> ; rdar://7396984
>
> - at str = private constant [28 x i8] c"xxxxxxxxxxxxxxxxxxxxxxxxxxx\00",
> align 1
> + at str = private unnamed_addr constant [28 x i8]
> c"xxxxxxxxxxxxxxxxxxxxxxxxxxx\00", align 1
>
> define void @t(i32 %count) ssp nounwind {
> entry:
>
> Added: llvm/trunk/test/CodeGen/X86/osx-private-labels.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/osx-private-labels.ll?rev=201608&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/osx-private-labels.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/osx-private-labels.ll Tue Feb 18 16:24:57
> 2014
> @@ -0,0 +1,71 @@
> +; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
> +; Test all the cases where a L label is safe. Removing any entry from
> +; TargetLoweringObjectFileMachO::isSectionAtomizableBySymbols should cause
> +; this to fail.
> +; We also test some noteworthy cases that require an l label.
> +
> + at private1 = private unnamed_addr constant [4 x i8] c"zed\00"
> +; CHECK: .section __TEXT,__cstring,cstring_literals
> +; CHECK-NEXT: L_private1:
> +
> + at private2 = private unnamed_addr constant [5 x i16] [i16 116, i16 101,
> + i16 115, i16 116,
> i16 0]
> +; CHECK: .section __TEXT,__ustring
> +; CHECK-NEXT: .align 1
> +; CHECK-NEXT: l_private2:
> +
> +; There is no dedicated 4 byte strings on MachO.
> +
> +%struct.NSConstantString = type { i32*, i32, i8*, i32 }
> + at private3 = private constant %struct.NSConstantString { i32* null, i32
> 1992, i8* null, i32 0 }, section "__DATA,__cfstring"
> +; CHECK: .section __DATA,__cfstring
> +; CHECK-NEXT: .align 4
> +; CHECK-NEXT: L_private3:
> +
> +; There is no dedicated 1 or 2 byte constant section on MachO.
> +
> + at private4 = private unnamed_addr constant i32 42
> +; CHECK: .section __TEXT,__literal4,4byte_literals
> +; CHECK-NEXT: .align 2
> +; CHECK-NEXT: L_private4:
> +
> + at private5 = private unnamed_addr constant i64 42
> +; CHECK: .section __TEXT,__literal8,8byte_literals
> +; CHECK-NEXT: .align 3
> +; CHECK-NEXT: L_private5:
> +
> + at private6 = private unnamed_addr constant i128 42
> +; CHECK: .section __TEXT,__literal16,16byte_literals
> +; CHECK-NEXT: .align 3
> +; CHECK-NEXT: L_private6:
> +
> +%struct._objc_class = type { i8* }
> + at private7 = private global %struct._objc_class* null, section
> "__OBJC,__cls_refs,literal_pointers,no_dead_strip"
> +; CHECK: .section __OBJC,__cls_refs,literal_pointers,no_dead_strip
> +; CHECK: .align 3
> +; CHECK: L_private7:
> +
> + at private8 = private global i32* null, section
> "__DATA,__nl_symbol_ptr,non_lazy_symbol_pointers"
> +; CHECK: .section __DATA,__nl_symbol_ptr,non_lazy_symbol_pointers
> +; CHECK-NEXT: .align 3
> +; CHECK-NEXT: L_private8:
> +
> + at private9 = private global i32* null, section
> "__DATA,__la_symbol_ptr,lazy_symbol_pointers"
> +; CHECK: .section __DATA,__la_symbol_ptr,lazy_symbol_pointers
> +; CHECK-NEXT: .align 3
> +; CHECK-NEXT: L_private9:
> +
> + at private10 = private global i32* null, section
> "__DATA,__mod_init_func,mod_init_funcs"
> +; CHECK: .section __DATA,__mod_init_func,mod_init_funcs
> +; CHECK-NEXT: .align 3
> +; CHECK-NEXT: L_private10:
> +
> + at private11 = private global i32* null, section
> "__DATA,__mod_term_func,mod_term_funcs"
> +; CHECK: .section __DATA,__mod_term_func,mod_term_funcs
> +; CHECK-NEXT: .align 3
> +; CHECK-NEXT: L_private11:
> +
> + at private12 = private global i32* null, section
> "__DATA,__foobar,interposing"
> +; CHECK: .section __DATA,__foobar,interposing
> +; CHECK-NEXT: .align 3
> +; CHECK-NEXT: L_private12:
>
> Modified: llvm/trunk/test/CodeGen/X86/pr10420.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr10420.ll?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/pr10420.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/pr10420.ll Tue Feb 18 16:24:57 2014
> @@ -14,7 +14,7 @@ define void @bar() {
> ret void;
> }
>
> -; CHECK: L_foo: ## @foo
> +; CHECK: l_foo: ## @foo
> ; CHECK-NEXT: Ltmp0:
>
> ; CHECK: _bar: ## @bar
> @@ -34,7 +34,7 @@ define void @bar() {
> ; CHECK-NEXT: {{.quad|.long}} Ltmp[[NUM2]]
>
>
> -; OLD: L_foo: ## @foo
> +; OLD: l_foo: ## @foo
> ; OLD-NEXT: Ltmp0:
>
> ; OLD: _bar: ## @bar
>
> Modified: llvm/trunk/test/CodeGen/X86/private-2.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/private-2.ll?rev=201608&r1=201607&r2=201608&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/private-2.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/private-2.ll Tue Feb 18 16:24:57 2014
> @@ -2,7 +2,7 @@
> ; Quote should be outside of private prefix.
> ; rdar://6855766x
>
> -; CHECK: L__ZZ20
> +; CHECK: "l__ZZ20-[Example1 whatever]E4C.91"
>
> %struct.A = type { i32*, i32 }
> @"_ZZ20-[Example1 whatever]E4C.91" = private constant %struct.A { i32*
> null, i32 1 } ; <%struct.A*> [#uses=1]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140219/d2a6a7b5/attachment.html>
More information about the llvm-commits
mailing list