From 3924868a957d5a6d468b61741cbb7db77324d1f6 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 23 Jan 2010 05:19:23 +0000 Subject: [PATCH] mcize jump table and constant pool entry labels, .local on elf, and some .weak directives. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94284 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/AsmPrinter.h | 6 +++ include/llvm/MC/MCStreamer.h | 1 + lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 74 ++++++++++++++++----------- lib/MC/MCAsmStreamer.cpp | 3 +- 4 files changed, 54 insertions(+), 30 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index f527562564a..799eeb04869 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -321,6 +321,12 @@ namespace llvm { /// block label. MCSymbol *GetMBBSymbol(unsigned MBBID) const; + /// GetCPISymbol - Return the symbol for the specified constant pool entry. + MCSymbol *GetCPISymbol(unsigned CPID) const; + + /// GetJTISymbol - Return the symbol for the specified jump table entry. + MCSymbol *GetJTISymbol(unsigned JTID, bool isLinkerPrivate = false) const; + /// GetBlockAddressSymbol - Return the MCSymbol used to satisfy BlockAddress /// uses of the specified basic block. MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA, diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index bd21ec574b4..3f567e99856 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -47,6 +47,7 @@ namespace llvm { IndirectSymbol, /// .indirect_symbol (Apple) Internal, /// .internal (ELF) LazyReference, /// .lazy_reference (Apple) + Local, /// .local (ELF) NoDeadStrip, /// .no_dead_strip (Apple) PrivateExtern, /// .private_extern (Apple) Protected, /// .protected (ELF) diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index f6b6307c2f2..3d2f4157413 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -115,9 +115,9 @@ bool AsmPrinter::doInitialization(Module &M) { EmitStartOfAsmFile(M); if (MAI->hasSingleParameterDotFile()) { - /* Very minimal debug info. It is ignored if we emit actual - debug info. If we don't, this at least helps the user find where - a function came from. */ + // Very minimal debug info. It is ignored if we emit actual + // debug info. If we don't, this at least helps the user find where + // a function came from. O << "\t.file\t\"" << M.getModuleIdentifier() << "\"\n"; } @@ -197,13 +197,12 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) { if (const char *LComm = MAI->getLCOMMDirective()) { // .lcomm _foo, 42 - O << LComm << *GVSym << ',' << Size; - O << '\n'; + O << LComm << *GVSym << ',' << Size << '\n'; return; } // .local _foo - O << "\t.local\t" << *GVSym << '\n'; + OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Local); // .comm _foo, 42, 4 OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog); return; @@ -302,12 +301,14 @@ bool AsmPrinter::doFinalization(Module &M) { for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) { if (!I->hasExternalWeakLinkage()) continue; - O << MAI->getWeakRefDirective() << *GetGlobalValueSymbol(I) << '\n'; + OutStreamer.EmitSymbolAttribute(GetGlobalValueSymbol(I), + MCStreamer::WeakReference); } for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { if (!I->hasExternalWeakLinkage()) continue; - O << MAI->getWeakRefDirective() << *GetGlobalValueSymbol(I) << '\n'; + OutStreamer.EmitSymbolAttribute(GetGlobalValueSymbol(I), + MCStreamer::WeakReference); } } @@ -321,9 +322,9 @@ bool AsmPrinter::doFinalization(Module &M) { MCSymbol *Target = GetGlobalValueSymbol(GV); if (I->hasExternalLinkage() || !MAI->getWeakRefDirective()) - O << "\t.globl\t" << *Name << '\n'; + OutStreamer.EmitSymbolAttribute(Name, MCStreamer::Global); else if (I->hasWeakLinkage()) - O << MAI->getWeakRefDirective() << *Name << '\n'; + OutStreamer.EmitSymbolAttribute(Name, MCStreamer::WeakReference); else assert(I->hasLocalLinkage() && "Invalid alias linkage"); @@ -343,6 +344,8 @@ bool AsmPrinter::doFinalization(Module &M) { // to be executable. Some targets have a directive to declare this. Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) + // FIXME: This is actually a section switch on linux/x86 and systemz, use + // switch section. if (MAI->getNonexecutableStackDirective()) O << MAI->getNonexecutableStackDirective() << '\n'; @@ -449,14 +452,15 @@ void AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) { const Type *Ty = CPE.getType(); Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty); - O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' - << CPI << ':'; + // Emit the label with a comment on it. if (VerboseAsm) { - O.PadToColumn(MAI->getCommentColumn()); - O << MAI->getCommentString() << " constant "; - WriteTypeSymbolic(O, CPE.getType(), MF->getFunction()->getParent()); + OutStreamer.GetCommentOS() << "constant pool "; + WriteTypeSymbolic(OutStreamer.GetCommentOS(), CPE.getType(), + MF->getFunction()->getParent()); + OutStreamer.GetCommentOS() << '\n'; } - O << '\n'; + OutStreamer.EmitLabel(GetCPISymbol(CPI)); + if (CPE.isMachineConstantPoolEntry()) EmitMachineConstantPoolValue(CPE.Val.MachineCPVal); else @@ -518,14 +522,11 @@ void AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI, // before each jump table. The first label is never referenced, but tells // the assembler and linker the extents of the jump table object. The // second label is actually referenced by the code. - if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) { - O << MAI->getLinkerPrivateGlobalPrefix() - << "JTI" << getFunctionNumber() << '_' << i << ":\n"; - } - - O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() - << '_' << i << ":\n"; - + if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) + OutStreamer.EmitLabel(GetJTISymbol(i, true)); + + OutStreamer.EmitLabel(GetJTISymbol(i)); + for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { printPICJumpTableEntry(MJTI, JTBBs[ii], i); O << '\n'; @@ -564,8 +565,7 @@ void AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, // If the arch uses custom Jump Table directives, don't calc relative to // JT if (!HadJTEntryDirective) - O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" - << getFunctionNumber() << '_' << uid; + O << '-' << *GetJTISymbol(uid); } } @@ -1445,7 +1445,24 @@ MCSymbol *AsmPrinter::GetMBBSymbol(unsigned MBBID) const { SmallString<60> Name; raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "BB" << getFunctionNumber() << '_' << MBBID; - + return OutContext.GetOrCreateSymbol(Name.str()); +} + +/// GetCPISymbol - Return the symbol for the specified constant pool entry. +MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const { + SmallString<60> Name; + raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "CPI" + << getFunctionNumber() << '_' << CPID; + return OutContext.GetOrCreateSymbol(Name.str()); +} + +/// GetJTISymbol - Return the symbol for the specified jump table entry. +MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const { + const char *Prefix = isLinkerPrivate ? MAI->getLinkerPrivateGlobalPrefix() : + MAI->getPrivateGlobalPrefix(); + SmallString<60> Name; + raw_svector_ostream(Name) << Prefix << "JTI" << getFunctionNumber() << '_' + << JTID; return OutContext.GetOrCreateSymbol(Name.str()); } @@ -1597,8 +1614,7 @@ void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix() << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',' << *GetMBBSymbol(MBB->getNumber()) - << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() - << '_' << uid << '\n'; + << '-' << *GetJTISymbol(uid) << '\n'; } void AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2, diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 75903aa8449..b0e9705f0a7 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -224,13 +224,14 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol, case IndirectSymbol: OS << ".indirect_symbol "; break; case Internal: OS << ".internal "; break; case LazyReference: OS << ".lazy_reference "; break; + case Local: OS << ".local "; break; case NoDeadStrip: OS << ".no_dead_strip "; break; case PrivateExtern: OS << ".private_extern "; break; case Protected: OS << ".protected "; break; case Reference: OS << ".reference "; break; case Weak: OS << ".weak "; break; case WeakDefinition: OS << ".weak_definition "; break; - case WeakReference: OS << ".weak_reference "; break; + case WeakReference: OS << MAI.getWeakRefDirective(); break;// .weak_reference } OS << *Symbol;