X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FELFTargetAsmInfo.cpp;h=624b95c7b6c162e643545d7665d0c968a507c83a;hb=053372dc3c25c5442b7349c612104e15c41233e8;hp=82ac847e845fcb9e9d4f54ee35b202b77eb37878;hpb=feac94b18d8267c14ce4076741e7cf32196ed6d9;p=oota-llvm.git diff --git a/lib/Target/ELFTargetAsmInfo.cpp b/lib/Target/ELFTargetAsmInfo.cpp index 82ac847e845..624b95c7b6c 100644 --- a/lib/Target/ELFTargetAsmInfo.cpp +++ b/lib/Target/ELFTargetAsmInfo.cpp @@ -24,17 +24,15 @@ using namespace llvm; -ELFTargetAsmInfo::ELFTargetAsmInfo(const TargetMachine &TM) { - ETM = &TM; +ELFTargetAsmInfo::ELFTargetAsmInfo(const TargetMachine &TM) + : TargetAsmInfo(TM) { - TextSection_ = getUnnamedSection("\t.text", SectionFlags::Code); - DataSection_ = getUnnamedSection("\t.data", SectionFlags::Writeable); BSSSection_ = getUnnamedSection("\t.bss", SectionFlags::Writeable | SectionFlags::BSS); - ReadOnlySection_ = getNamedSection("\t.rodata", SectionFlags::None); - TLSDataSection_ = getNamedSection("\t.tdata", - SectionFlags::Writeable | SectionFlags::TLS); - TLSBSSSection_ = getNamedSection("\t.tbss", + ReadOnlySection = getNamedSection("\t.rodata", SectionFlags::None); + TLSDataSection = getNamedSection("\t.tdata", + SectionFlags::Writeable | SectionFlags::TLS); + TLSBSSSection = getNamedSection("\t.tbss", SectionFlags::Writeable | SectionFlags::TLS | SectionFlags::BSS); } @@ -46,10 +44,11 @@ ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { if (const Function *F = dyn_cast(GV)) { switch (F->getLinkage()) { default: assert(0 && "Unknown linkage type!"); + case Function::PrivateLinkage: case Function::InternalLinkage: case Function::DLLExportLinkage: case Function::ExternalLinkage: - return getTextSection_(); + return TextSection; case Function::WeakLinkage: case Function::LinkOnceLinkage: std::string Name = UniqueSectionForGlobal(GV, Kind); @@ -57,7 +56,7 @@ ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { return getNamedSection(Name.c_str(), Flags); } } else if (const GlobalVariable *GVar = dyn_cast(GV)) { - if (GVar->isWeakForLinker()) { + if (GVar->mayBeOverridden()) { std::string Name = UniqueSectionForGlobal(GVar, Kind); unsigned Flags = SectionFlagsForGlobal(GVar, Name.c_str()); return getNamedSection(Name.c_str(), Flags); @@ -65,29 +64,31 @@ ELFTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const { switch (Kind) { case SectionKind::Data: case SectionKind::SmallData: - return getDataSection_(); + return DataSection; case SectionKind::BSS: case SectionKind::SmallBSS: // ELF targets usually have BSS sections return getBSSSection_(); case SectionKind::ROData: case SectionKind::SmallROData: - return getReadOnlySection_(); + return getReadOnlySection(); case SectionKind::RODataMergeStr: return MergeableStringSection(GVar); case SectionKind::RODataMergeConst: return MergeableConstSection(GVar); case SectionKind::ThreadData: // ELF targets usually support TLS stuff - return getTLSDataSection_(); + return TLSDataSection; case SectionKind::ThreadBSS: - return getTLSBSSSection_(); + return TLSBSSSection; default: assert(0 && "Unsuported section kind for global"); } } } else assert(0 && "Unsupported global"); + + return NULL; } const Section* @@ -98,18 +99,18 @@ ELFTargetAsmInfo::SelectSectionForMachineConst(const Type *Ty) const { const Section* ELFTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const { - Constant *C = cast(GV)->getInitializer(); + Constant *C = GV->getInitializer(); return MergeableConstSection(C->getType()); } inline const Section* ELFTargetAsmInfo::MergeableConstSection(const Type *Ty) const { - const TargetData *TD = ETM->getTargetData(); + const TargetData *TD = TM.getTargetData(); // FIXME: string here is temporary, until stuff will fully land in. // We cannot use {Four,Eight,Sixteen}ByteConstantSection here, since it's // currently directly used by asmprinter. - unsigned Size = TD->getABITypeSize(Ty); + unsigned Size = TD->getTypePaddedSize(Ty); if (Size == 4 || Size == 8 || Size == 16) { std::string Name = ".rodata.cst" + utostr(Size); @@ -118,22 +119,20 @@ ELFTargetAsmInfo::MergeableConstSection(const Type *Ty) const { Size)); } - return getReadOnlySection_(); + return getReadOnlySection(); } const Section* ELFTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const { - const TargetData *TD = ETM->getTargetData(); + const TargetData *TD = TM.getTargetData(); Constant *C = cast(GV)->getInitializer(); - const ConstantArray *CVA = cast(C); - const Type *Ty = CVA->getType()->getElementType(); + const Type *Ty = cast(C->getType())->getElementType(); - unsigned Size = TD->getABITypeSize(Ty); + unsigned Size = TD->getTypePaddedSize(Ty); if (Size <= 16) { assert(getCStringSection() && "Should have string section prefix"); // We also need alignment here - const TargetData *TD = ETM->getTargetData(); unsigned Align = TD->getPrefTypeAlignment(Ty); if (Align < Size) Align = Size; @@ -145,10 +144,10 @@ ELFTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const { return getNamedSection(Name.c_str(), Flags); } - return getReadOnlySection_(); + return getReadOnlySection(); } -std::string ELFTargetAsmInfo::PrintSectionFlags(unsigned flags) const { +std::string ELFTargetAsmInfo::printSectionFlags(unsigned flags) const { std::string Flags = ",\""; if (!(flags & SectionFlags::Debug)) @@ -185,4 +184,3 @@ std::string ELFTargetAsmInfo::PrintSectionFlags(unsigned flags) const { return Flags; } -