From 711b6dce246c87b5d830966bed823d0e7aa15300 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 8 Aug 2008 06:56:16 +0000 Subject: [PATCH] It's not legal to output a GV in a coalesced section if it's used in an ARM PIC relative constantpool. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54519 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/DarwinTargetAsmInfo.h | 3 +- include/llvm/Target/ELFTargetAsmInfo.h | 3 +- include/llvm/Target/TargetAsmInfo.h | 9 ++++-- lib/Target/ARM/ARMAsmPrinter.cpp | 32 ++++++++++++++++------ lib/Target/DarwinTargetAsmInfo.cpp | 17 ++++++------ lib/Target/ELFTargetAsmInfo.cpp | 3 +- lib/Target/Mips/MipsTargetAsmInfo.cpp | 2 +- lib/Target/Mips/MipsTargetAsmInfo.h | 3 +- lib/Target/TargetAsmInfo.cpp | 8 +++--- test/CodeGen/ARM/2008-08-07-AsmPrintBug.ll | 13 +++++++++ 10 files changed, 64 insertions(+), 29 deletions(-) create mode 100644 test/CodeGen/ARM/2008-08-07-AsmPrintBug.ll diff --git a/include/llvm/Target/DarwinTargetAsmInfo.h b/include/llvm/Target/DarwinTargetAsmInfo.h index 0ed9b387037..3403f066159 100644 --- a/include/llvm/Target/DarwinTargetAsmInfo.h +++ b/include/llvm/Target/DarwinTargetAsmInfo.h @@ -30,7 +30,8 @@ namespace llvm { const Section* DataCoalSection; explicit DarwinTargetAsmInfo(const TargetMachine &TM); - virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const; + virtual const Section* SelectSectionForGlobal(const GlobalValue *GV, + bool NoCoalesce = false) const; virtual std::string UniqueSectionForGlobal(const GlobalValue* GV, SectionKind::Kind kind) const; const Section* MergeableConstSection(const GlobalVariable *GV) const; diff --git a/include/llvm/Target/ELFTargetAsmInfo.h b/include/llvm/Target/ELFTargetAsmInfo.h index fe339f8e591..b8261ef1da5 100644 --- a/include/llvm/Target/ELFTargetAsmInfo.h +++ b/include/llvm/Target/ELFTargetAsmInfo.h @@ -26,7 +26,8 @@ namespace llvm { struct ELFTargetAsmInfo: public virtual TargetAsmInfo { explicit ELFTargetAsmInfo(const TargetMachine &TM); - virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const; + virtual const Section* SelectSectionForGlobal(const GlobalValue *GV, + bool NoCoalesce = false) const; virtual std::string PrintSectionFlags(unsigned flags) const; const Section* MergeableConstSection(const GlobalVariable *GV) const; inline const Section* MergeableConstSection(const Type *Ty) const; diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 04e91cb3812..2fd1492c992 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -544,8 +544,10 @@ namespace llvm { const char* name = NULL) const; /// SectionForGlobal - This hooks returns proper section name for given - /// global with all necessary flags and marks. - virtual std::string SectionForGlobal(const GlobalValue *GV) const; + /// global with all necessary flags and marks. If NoCoalesce is true, + /// do not use coalesced section. + virtual std::string SectionForGlobal(const GlobalValue *GV, + bool NoCoalesce = false) const; // Helper methods for SectionForGlobal virtual std::string UniqueSectionForGlobal(const GlobalValue* GV, @@ -553,7 +555,8 @@ namespace llvm { virtual std::string PrintSectionFlags(unsigned flags) const { return ""; } - virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const; + virtual const Section* SelectSectionForGlobal(const GlobalValue *GV, + bool NoCoalesce = false) const; virtual const Section* SelectSectionForMachineConst(const Type *Ty) const; diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 3b30f9c5a0d..420ccd0bcc9 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -29,6 +29,7 @@ #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/Compiler.h" @@ -65,14 +66,18 @@ namespace { typedef std::map ValueMapTy; ValueMapTy NumberForBB; - /// Keeps the set of GlobalValues that require non-lazy-pointers for - /// indirect access. + /// GVNonLazyPtrs - Keeps the set of GlobalValues that require + /// non-lazy-pointers for indirect access. std::set GVNonLazyPtrs; - /// Keeps the set of external function GlobalAddresses that the asm - /// printer should generate stubs for. + /// FnStubs - Keeps the set of external function GlobalAddresses that the + /// asm printer should generate stubs for. std::set FnStubs; + /// PCRelGVs - Keeps the set of GlobalValues used in pc relative + /// constantpool. + SmallPtrSet PCRelGVs; + /// True if asm printer is printing a series of CONSTPOOL_ENTRY. bool InCPMode; @@ -124,10 +129,12 @@ namespace { /// specified function body into. virtual std::string getSectionForFunction(const Function &F) const; + /// EmitMachineConstantPoolValue - Print a machine constantpool value to + /// the .s file. virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { printDataDirective(MCPV->getType()); - ARMConstantPoolValue *ACPV = (ARMConstantPoolValue*)MCPV; + ARMConstantPoolValue *ACPV = static_cast(MCPV); GlobalValue *GV = ACPV->getGV(); std::string Name = GV ? Mang->getValueName(GV) : TAI->getGlobalPrefix(); if (!GV) @@ -680,9 +687,15 @@ void ARMAsmPrinter::printCPInstOperand(const MachineInstr *MI, int OpNo, const MachineConstantPoolEntry &MCPE = // Chasing pointers is fun? MI->getParent()->getParent()->getConstantPool()->getConstants()[CPI]; - if (MCPE.isMachineConstantPoolEntry()) + if (MCPE.isMachineConstantPoolEntry()) { EmitMachineConstantPoolValue(MCPE.Val.MachineCPVal); - else { + ARMConstantPoolValue *ACPV = + static_cast(MCPE.Val.MachineCPVal); + if (ACPV->getPCAdjustment() != 0) { + const GlobalValue *GV = ACPV->getGV(); + PCRelGVs.insert(GV); + } + } else { EmitGlobalConstant(MCPE.Val.ConstVal); // remember to emit the weak reference if (const GlobalValue *GV = dyn_cast(MCPE.Val.ConstVal)) @@ -850,7 +863,8 @@ void ARMAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) { return; } - std::string SectionName = TAI->SectionForGlobal(GVar); + bool NoCoalesc = PCRelGVs.count(GVar); + std::string SectionName = TAI->SectionForGlobal(GVar, NoCoalesc); std::string name = Mang->getValueName(GVar); Constant *C = GVar->getInitializer(); const Type *Type = C->getType(); @@ -887,7 +901,7 @@ void ARMAsmPrinter::printModuleLevelGV(const GlobalVariable* GVar) { if (Size == 0) Size = 1; // .comm Foo, 0 is undefined, avoid it. if (TAI->getLCOMMDirective() != NULL) { - if (GVar->hasInternalLinkage()) { + if (NoCoalesc || GVar->hasInternalLinkage()) { O << TAI->getLCOMMDirective() << name << "," << Size; if (Subtarget->isTargetDarwin()) O << "," << Align; diff --git a/lib/Target/DarwinTargetAsmInfo.cpp b/lib/Target/DarwinTargetAsmInfo.cpp index 749cb717943..978f5cf36ac 100644 --- a/lib/Target/DarwinTargetAsmInfo.cpp +++ b/lib/Target/DarwinTargetAsmInfo.cpp @@ -51,14 +51,15 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) { } const Section* -DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { +DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV, + bool NoCoalesce) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); - bool isWeak = GV->isWeakForLinker(); + bool CanCoalesce = !NoCoalesce && GV->isWeakForLinker(); bool isNonStatic = (DTM->getRelocationModel() != Reloc::Static); switch (Kind) { case SectionKind::Text: - if (isWeak) + if (CanCoalesce) return TextCoalSection; else return getTextSection_(); @@ -67,18 +68,18 @@ DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { case SectionKind::BSS: case SectionKind::ThreadBSS: if (cast(GV)->isConstant()) - return (isWeak ? ConstDataCoalSection : ConstDataSection); + return (CanCoalesce ? ConstDataCoalSection : ConstDataSection); else - return (isWeak ? DataCoalSection : getDataSection_()); + return (CanCoalesce ? DataCoalSection : getDataSection_()); case SectionKind::ROData: - return (isWeak ? ConstDataCoalSection : + return (CanCoalesce ? ConstDataCoalSection : (isNonStatic ? ConstDataSection : getReadOnlySection_())); case SectionKind::RODataMergeStr: - return (isWeak ? + return (CanCoalesce ? ConstDataCoalSection : MergeableStringSection(cast(GV))); case SectionKind::RODataMergeConst: - return (isWeak ? + return (CanCoalesce ? ConstDataCoalSection: MergeableConstSection(cast(GV))); default: diff --git a/lib/Target/ELFTargetAsmInfo.cpp b/lib/Target/ELFTargetAsmInfo.cpp index 82ac847e845..523527c7b6d 100644 --- a/lib/Target/ELFTargetAsmInfo.cpp +++ b/lib/Target/ELFTargetAsmInfo.cpp @@ -40,7 +40,8 @@ ELFTargetAsmInfo::ELFTargetAsmInfo(const TargetMachine &TM) { } const Section* -ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { +ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV, + bool NoCoalesce) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); if (const Function *F = dyn_cast(GV)) { diff --git a/lib/Target/Mips/MipsTargetAsmInfo.cpp b/lib/Target/Mips/MipsTargetAsmInfo.cpp index 04edd0d4b53..eff69abc6db 100644 --- a/lib/Target/Mips/MipsTargetAsmInfo.cpp +++ b/lib/Target/Mips/MipsTargetAsmInfo.cpp @@ -82,7 +82,7 @@ SectionKindForGlobal(const GlobalValue *GV) const { } const Section* MipsTargetAsmInfo:: -SelectSectionForGlobal(const GlobalValue *GV) const { +SelectSectionForGlobal(const GlobalValue *GV, bool NoCoalesce) const { SectionKind::Kind K = SectionKindForGlobal(GV); const GlobalVariable *GVA = dyn_cast(GV); diff --git a/lib/Target/Mips/MipsTargetAsmInfo.h b/lib/Target/Mips/MipsTargetAsmInfo.h index 2b5a739e721..806cda8be36 100644 --- a/lib/Target/Mips/MipsTargetAsmInfo.h +++ b/lib/Target/Mips/MipsTargetAsmInfo.h @@ -40,7 +40,8 @@ namespace llvm { SectionFlagsForGlobal(const GlobalValue *GV = NULL, const char* name = NULL) const; - virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const; + virtual const Section* SelectSectionForGlobal(const GlobalValue *GV, + bool NoCoalesce) const; private: const MipsSubtarget *Subtarget; diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 9bc0b4055e3..cf431126349 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -272,7 +272,7 @@ TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV, } std::string -TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { +TargetAsmInfo::SectionForGlobal(const GlobalValue *GV, bool NoCoalesce) const { const Section* S; // Select section name if (GV->hasSection()) { @@ -282,7 +282,7 @@ TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { S = getNamedSection(GV->getSection().c_str(), Flags); } else { // Use default section depending on the 'type' of global - S = SelectSectionForGlobal(GV); + S = SelectSectionForGlobal(GV, NoCoalesce); } if (!S->isNamed()) @@ -295,8 +295,8 @@ TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { } // Lame default implementation. Calculate the section name for global. -const Section* -TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { +const Section* TargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV, + bool NoCoalesce) const { SectionKind::Kind Kind = SectionKindForGlobal(GV); if (GV->isWeakForLinker()) { diff --git a/test/CodeGen/ARM/2008-08-07-AsmPrintBug.ll b/test/CodeGen/ARM/2008-08-07-AsmPrintBug.ll new file mode 100644 index 00000000000..d2a8bb24cad --- /dev/null +++ b/test/CodeGen/ARM/2008-08-07-AsmPrintBug.ll @@ -0,0 +1,13 @@ +; RUN: llvm-as < %s | llc -mtriple=arm-apple-darwin -mattr=+v6 -relocation-model=pic | grep lcomm + + %struct.FILE = type { i8*, i32, i32, i16, i16, %struct.__sbuf, i32, i8*, i32 (i8*)*, i32 (i8*, i8*, i32)*, i64 (i8*, i64, i32)*, i32 (i8*, i8*, i32)*, %struct.__sbuf, %struct.__sFILEX*, i32, [3 x i8], [1 x i8], %struct.__sbuf, i32, i64 } + %struct.__gcov_var = type { %struct.FILE*, i32, i32, i32, i32, i32, i32, [1025 x i32] } + %struct.__sFILEX = type opaque + %struct.__sbuf = type { i8*, i32 } +@__gcov_var = common global %struct.__gcov_var zeroinitializer ; <%struct.__gcov_var*> [#uses=1] + +define i32 @__gcov_close() nounwind { +entry: + load i32* getelementptr (%struct.__gcov_var* @__gcov_var, i32 0, i32 5), align 4 ; :0 [#uses=1] + ret i32 %0 +} -- 2.34.1