summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-23 05:19:23 +0000
committerChris Lattner <sabre@nondot.org>2010-01-23 05:19:23 +0000
commit3924868a957d5a6d468b61741cbb7db77324d1f6 (patch)
tree57d02e4f321925c7d7fd3563b11f8c6ec90624f4 /lib
parent05f845314a67f9c30a67e55ce1e3168ff6732ce8 (diff)
downloadllvm-3924868a957d5a6d468b61741cbb7db77324d1f6.tar.gz
llvm-3924868a957d5a6d468b61741cbb7db77324d1f6.tar.bz2
llvm-3924868a957d5a6d468b61741cbb7db77324d1f6.tar.xz
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
Diffstat (limited to 'lib')
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp74
-rw-r--r--lib/MC/MCAsmStreamer.cpp3
2 files changed, 47 insertions, 30 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index f6b6307c2f..3d2f415741 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 75903aa844..b0e9705f0a 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;