From: Anton Korobeynikov Date: Wed, 24 Sep 2008 22:17:59 +0000 (+0000) Subject: Use generic section-handling stuff to emit constant pool entries X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=088ae8393f124564ca9ab70654645aa656e5646f;p=oota-llvm.git Use generic section-handling stuff to emit constant pool entries git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56579 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 077f5b1e774..d3850a5fb36 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -366,8 +366,6 @@ namespace llvm { const GlobalValue *findGlobalValue(const Constant* CV); void EmitLLVMUsedList(Constant *List); void EmitXXStructorList(Constant *List); - void EmitConstantPool(unsigned Alignment, const char *Section, - std::vector > &CP); GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); }; } diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 3c25ab73b21..1f15c4a748f 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -28,6 +28,7 @@ #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetRegisterInfo.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" @@ -255,60 +256,50 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) { const std::vector &CP = MCP->getConstants(); if (CP.empty()) return; - // Some targets require 4-, 8-, and 16- byte constant literals to be placed - // in special sections. - std::vector > FourByteCPs; - std::vector > EightByteCPs; - std::vector > SixteenByteCPs; - std::vector > OtherCPs; - std::vector > TargetCPs; + // Calculate sections for constant pool entries. We collect entries to go into + // the same section together to reduce amount of section switch statements. + typedef + std::multimap > CPMap; + CPMap CPs; + DenseSet Sections; + for (unsigned i = 0, e = CP.size(); i != e; ++i) { MachineConstantPoolEntry CPE = CP[i]; - const Type *Ty = CPE.getType(); - if (TAI->getFourByteConstantSection() && - TM.getTargetData()->getABITypeSize(Ty) == 4) - FourByteCPs.push_back(std::make_pair(CPE, i)); - else if (TAI->getEightByteConstantSection() && - TM.getTargetData()->getABITypeSize(Ty) == 8) - EightByteCPs.push_back(std::make_pair(CPE, i)); - else if (TAI->getSixteenByteConstantSection() && - TM.getTargetData()->getABITypeSize(Ty) == 16) - SixteenByteCPs.push_back(std::make_pair(CPE, i)); - else - OtherCPs.push_back(std::make_pair(CPE, i)); + const Section* S = TAI->SelectSectionForMachineConst(CPE.getType()); + CPs.insert(std::make_pair(S, std::make_pair(CPE, i))); + Sections.insert(S); } - unsigned Alignment = MCP->getConstantPoolAlignment(); - EmitConstantPool(Alignment, TAI->getFourByteConstantSection(), FourByteCPs); - EmitConstantPool(Alignment, TAI->getEightByteConstantSection(), EightByteCPs); - EmitConstantPool(Alignment, TAI->getSixteenByteConstantSection(), - SixteenByteCPs); - EmitConstantPool(Alignment, TAI->getConstantPoolSection(), OtherCPs); -} + // Now print stuff into the calculated sections. + for (DenseSet::iterator IS = Sections.begin(), + ES = Sections.end(); IS != ES; ++IS) { + SwitchToSection(*IS); + EmitAlignment(MCP->getConstantPoolAlignment()); -void AsmPrinter::EmitConstantPool(unsigned Alignment, const char *Section, - std::vector > &CP) { - if (CP.empty()) return; + std::pair II = CPs.equal_range(*IS); + for (CPMap::iterator I = II.first, E = II.second; I != E; ++I) { + CPMap::iterator J = next(I); + MachineConstantPoolEntry Entry = I->second.first; + unsigned index = I->second.second; - SwitchToDataSection(Section); - EmitAlignment(Alignment); - for (unsigned i = 0, e = CP.size(); i != e; ++i) { - O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' - << CP[i].second << ":\t\t\t\t\t"; + O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' + << index << ":\t\t\t\t\t"; // O << TAI->getCommentString() << ' ' << // WriteTypeSymbolic(O, CP[i].first.getType(), 0); - O << '\n'; - if (CP[i].first.isMachineConstantPoolEntry()) - EmitMachineConstantPoolValue(CP[i].first.Val.MachineCPVal); - else - EmitGlobalConstant(CP[i].first.Val.ConstVal); - if (i != e-1) { - const Type *Ty = CP[i].first.getType(); - unsigned EntSize = - TM.getTargetData()->getABITypeSize(Ty); - unsigned ValEnd = CP[i].first.getOffset() + EntSize; + O << '\n'; + if (Entry.isMachineConstantPoolEntry()) + EmitMachineConstantPoolValue(Entry.Val.MachineCPVal); + else + EmitGlobalConstant(Entry.Val.ConstVal); + // Emit inter-object padding for alignment. - EmitZeros(CP[i+1].first.getOffset()-ValEnd); + if (J != E) { + const Type *Ty = Entry.getType(); + unsigned EntSize = TM.getTargetData()->getABITypeSize(Ty); + unsigned ValEnd = Entry.getOffset() + EntSize; + EmitZeros(J->second.first.getOffset()-ValEnd); + } } } }