class AsmPrinter : public MachineFunctionPass {
static char ID;
- /// FunctionNumber - This provides a unique ID for each function emitted in
- /// this translation unit. It is autoincremented by SetupMachineFunction,
- /// and can be accessed with getFunctionNumber() and
- /// IncrementFunctionNumber().
- ///
- unsigned FunctionNumber;
-
protected:
// Necessary for external weak linkage support
std::set<const GlobalValue*> ExtWeakSymbols;
/// is being processed from runOnMachineFunction.
void SetupMachineFunction(MachineFunction &MF);
- /// getFunctionNumber - Return a unique ID for the current function.
- ///
- unsigned getFunctionNumber() const { return FunctionNumber; }
-
- /// IncrementFunctionNumber - Increase Function Number. AsmPrinters should
- /// not normally call this, as the counter is automatically bumped by
- /// SetupMachineFunction.
- void IncrementFunctionNumber() { FunctionNumber++; }
-
/// EmitConstantPool - Print to the current output stream assembly
/// representations of the constants in the constant pool MCP. This is
/// used to print out constants which have been "spilled to memory" by
char AsmPrinter::ID = 0;
AsmPrinter::AsmPrinter(std::ostream &o, TargetMachine &tm,
const TargetAsmInfo *T)
- : MachineFunctionPass((intptr_t)&ID), FunctionNumber(0), O(o), TM(tm), TAI(T)
+ : MachineFunctionPass((intptr_t)&ID), O(o), TM(tm), TAI(T)
{}
std::string AsmPrinter::getSectionForFunction(const Function &F) const {
void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
// What's my mangled name?
CurrentFnName = Mang->getValueName(MF.getFunction());
- IncrementFunctionNumber();
}
/// EmitConstantPool - Print to the current output stream assembly
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" << TAI->getCommentString() << " ";
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << CP[i].second
+ << '_' << CurrentFnName
+ << ":\t\t\t\t\t" << TAI->getCommentString() << ' ';
WriteTypeSymbolic(O, CP[i].first.getType(), 0) << '\n';
if (CP[i].first.isMachineConstantPoolEntry())
EmitMachineConstantPoolValue(CP[i].first.Val.MachineCPVal);
// the assembler and linker the extents of the jump table object. The
// second label is actually referenced by the code.
if (const char *JTLabelPrefix = TAI->getJumpTableSpecialLabelPrefix())
- O << JTLabelPrefix << "JTI" << getFunctionNumber() << '_' << i << ":\n";
+ O << JTLabelPrefix << "JTI" << i << '_' << CurrentFnName << ":\n";
- O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << '_' << i << ":\n";
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << i
+ << '_' << CurrentFnName << ":\n";
for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
O << JTEntryDirective << ' ';
// If we're emitting non-PIC code, then emit the entries as direct
// references to the target basic blocks.
if (!EmittedSets.empty()) {
- O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
- << '_' << i << "_set_" << JTBBs[ii]->getNumber();
+ O << TAI->getPrivateGlobalPrefix() << i
+ << '_' << "_set_" << JTBBs[ii]->getNumber() << '_' << CurrentFnName;
} else if (IsPic) {
printBasicBlockLabel(JTBBs[ii], false, false);
// If the arch uses custom Jump Table directives, don't calc relative to
// JT
if (!HadJTEntryDirective)
O << '-' << TAI->getPrivateGlobalPrefix() << "JTI"
- << getFunctionNumber() << '_' << i;
+ << i << '_' << CurrentFnName;
} else {
printBasicBlockLabel(JTBBs[ii], false, false);
}
void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB,
bool printColon,
bool printComment) const {
- O << TAI->getPrivateGlobalPrefix() << "BB" << getFunctionNumber() << "_"
- << MBB->getNumber();
+ O << TAI->getPrivateGlobalPrefix() << "BB" << MBB->getNumber() << '_'
+ << CurrentFnName;
if (printColon)
O << ':';
if (printComment && MBB->getBasicBlock())
return;
O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix()
- << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ',';
+ << uid << "_set_" << MBB->getNumber() << '_' << CurrentFnName << ',';
printBasicBlockLabel(MBB, false, false);
- O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << '_' << uid << '\n';
+ O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << uid
+ << '_' << CurrentFnName << '\n';
}
void AsmPrinter::printSetLabel(unsigned uid, unsigned uid2,
return;
O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix()
- << getFunctionNumber() << '_' << uid << '_' << uid2
- << "_set_" << MBB->getNumber() << ',';
+ << uid << '_' << uid2
+ << "_set_" << MBB->getNumber() << '_' << CurrentFnName << ',';
printBasicBlockLabel(MBB, false, false);
- O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << '_' << uid << '_' << uid2 << '\n';
+ O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << uid
+ << '_' << uid2 << '_' << CurrentFnName << '\n';
}
/// printDataDirective - This method prints the asm directive for the
break;
}
case MachineOperand::MO_ConstantPoolIndex:
- O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
- << '_' << MO.getConstantPoolIndex();
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << MO.getConstantPoolIndex()
+ << '_' << CurrentFnName;
break;
case MachineOperand::MO_JumpTableIndex:
- O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << '_' << MO.getJumpTableIndex();
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << MO.getJumpTableIndex()
+ << '_' << CurrentFnName;
break;
default:
O << "<unknown operand type>"; abort (); break;
// data itself.
if (!strcmp(Modifier, "label")) {
unsigned ID = MI->getOperand(OpNo).getImm();
- O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
- << '_' << ID << ":\n";
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << ID
+ << '_' << CurrentFnName << ":\n";
} else {
assert(!strcmp(Modifier, "cpentry") && "Unknown modifier for CPE");
unsigned CPI = MI->getOperand(OpNo).getConstantPoolIndex();
const MachineOperand &MO1 = MI->getOperand(OpNo);
const MachineOperand &MO2 = MI->getOperand(OpNo+1); // Unique Id
unsigned JTI = MO1.getJumpTableIndex();
- O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << '_' << JTI << '_' << MO2.getImmedValue() << ":\n";
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << JTI
+ << '_' << MO2.getImmedValue() << '_' << CurrentFnName << ":\n";
const char *JTEntryDirective = TAI->getJumpTableDirective();
if (!JTEntryDirective)
O << JTEntryDirective << ' ';
if (UseSet)
- O << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
- << '_' << JTI << '_' << MO2.getImmedValue()
- << "_set_" << MBB->getNumber();
+ O << TAI->getPrivateGlobalPrefix() << JTI
+ << '_' << MO2.getImmedValue()
+ << "_set_" << MBB->getNumber()
+ << CurrentFnName;
else if (TM.getRelocationModel() == Reloc::PIC_) {
printBasicBlockLabel(MBB, false, false);
// If the arch uses custom Jump Table directives, don't calc relative to JT
if (!TAI->getJumpTableDirective())
O << '-' << TAI->getPrivateGlobalPrefix() << "JTI"
- << getFunctionNumber() << '_' << JTI << '_' << MO2.getImmedValue();
+ << JTI << '_' << MO2.getImmedValue() << '_' << CurrentFnName;
} else
printBasicBlockLabel(MBB, false, false);
if (i != e-1)
return;
case MachineOperand::MO_ConstantPoolIndex:
- O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
- << MO.getConstantPoolIndex();
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << MO.getConstantPoolIndex()
+ << '_' << CurrentFnName;
return;
case MachineOperand::MO_ExternalSymbol:
}
case MachineOperand::MO_JumpTableIndex:
- O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << '_' << MO.getJumpTableIndex();
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << MO.getJumpTableIndex()
+ << '_' << CurrentFnName;
return;
default:
return;
case MachineOperand::MO_ConstantPoolIndex: {
O << "@gprel(" << TAI->getPrivateGlobalPrefix()
- << "CPI" << getFunctionNumber() << "_"
- << MO.getConstantPoolIndex() << ")";
+ << "CPI" << MO.getConstantPoolIndex() << '_'
+ << CurrentFnName << ")";
return;
}
case MachineOperand::MO_ConstantPoolIndex:
O << TAI->getPrivateGlobalPrefix() << "CPI"
- << getFunctionNumber() << "_" << MO.getConstantPoolIndex();
+ << MO.getConstantPoolIndex() << '_' << CurrentFnName;
break;
default:
O << "lo16(";
printOp(MI->getOperand(OpNo));
if (TM.getRelocationModel() == Reloc::PIC_)
- O << "-\"L" << getFunctionNumber() << "$pb\")";
+ O << "-\"L" "pb$" << CurrentFnName << "\")";
else
O << ')';
}
O << (int)MI->getOperand(OpNo).getImmedValue()*4;
}
void printPICLabel(const MachineInstr *MI, unsigned OpNo) {
- O << "\"L" << getFunctionNumber() << "$pb\"\n";
- O << "\"L" << getFunctionNumber() << "$pb\":";
+ O << "\"L" "pb$" << CurrentFnName << "\"\n";
+ O << "\"L" "pb$" << CurrentFnName << "\":";
}
void printSymbolHi(const MachineInstr *MI, unsigned OpNo) {
if (MI->getOperand(OpNo).isImmediate()) {
if (Subtarget.isDarwin()) O << "ha16(";
printOp(MI->getOperand(OpNo));
if (TM.getRelocationModel() == Reloc::PIC_)
- O << "-\"L" << getFunctionNumber() << "$pb\"";
+ O << "-\"L" "pb$" << CurrentFnName << "\"";
if (Subtarget.isDarwin())
O << ')';
else
if (Subtarget.isDarwin()) O << "lo16(";
printOp(MI->getOperand(OpNo));
if (TM.getRelocationModel() == Reloc::PIC_)
- O << "-\"L" << getFunctionNumber() << "$pb\"";
+ O << "-\"L" "pb$" << CurrentFnName << "\"";
if (Subtarget.isDarwin())
O << ')';
else
printBasicBlockLabel(MO.getMachineBasicBlock());
return;
case MachineOperand::MO_JumpTableIndex:
- O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << '_' << MO.getJumpTableIndex();
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << MO.getJumpTableIndex()
+ << '_' << CurrentFnName;
// FIXME: PIC relocation model
return;
case MachineOperand::MO_ConstantPoolIndex:
- O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber()
- << '_' << MO.getConstantPoolIndex();
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << MO.getConstantPoolIndex()
+ << '_' << CurrentFnName;
return;
case MachineOperand::MO_ExternalSymbol:
// Computing the address of an external symbol, not calling it.
O << MO.getSymbolName();
break;
case MachineOperand::MO_ConstantPoolIndex:
- O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
- << MO.getConstantPoolIndex();
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << MO.getConstantPoolIndex()
+ << '_' << CurrentFnName;
break;
default:
O << "<unknown operand type>"; abort (); break;
STATISTIC(EmittedInsts, "Number of machine instrs printed");
-static std::string computePICLabel(unsigned FnNum,
+static std::string computePICLabel(const std::string &FnName,
const TargetAsmInfo *TAI,
const X86Subtarget* Subtarget) {
std::string label;
if (Subtarget->isTargetDarwin())
- label = "\"L" + utostr_32(FnNum) + "$pb\"";
+ label = "\"L" "pb$" + FnName + "\"";
else if (Subtarget->isTargetELF())
- label = ".Lllvm$" + utostr_32(FnNum) + "$piclabel";
+ label = ".Lllvm$piclabel$" + FnName;
else
assert(0 && "Don't know how to print PIC label!\n");
case MachineOperand::MO_JumpTableIndex: {
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
if (!isMemOp) O << '$';
- O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << "_"
- << MO.getJumpTableIndex();
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << MO.getJumpTableIndex()
+ << '_' << CurrentFnName;
if (TM.getRelocationModel() == Reloc::PIC_) {
if (Subtarget->isPICStyleStub())
- O << "-\"" << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
- << "$pb\"";
+ O << "-\"" << TAI->getPrivateGlobalPrefix() << "pb$" << CurrentFnName
+ << "\"";
else if (Subtarget->isPICStyleGOT())
O << "@GOTOFF";
}
case MachineOperand::MO_ConstantPoolIndex: {
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
if (!isMemOp) O << '$';
- O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << "_"
- << MO.getConstantPoolIndex();
+ O << TAI->getPrivateGlobalPrefix() << "CPI" << MO.getConstantPoolIndex()
+ << '_' << CurrentFnName;
if (TM.getRelocationModel() == Reloc::PIC_) {
if (Subtarget->isPICStyleStub())
- O << "-\"" << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
- << "$pb\"";
+ O << "-\"" << TAI->getPrivateGlobalPrefix() << "pb$" << CurrentFnName
+ << "\"";
else if (Subtarget->isPICStyleGOT())
O << "@GOTOFF";
}
}
if (!isCallOp && TM.getRelocationModel() == Reloc::PIC_)
- O << "-\"" << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
- << "$pb\"";
+ O << "-\"" << TAI->getPrivateGlobalPrefix() << "pb$" << CurrentFnName
+ << "\"";
} else {
if (GV->hasDLLImportLinkage()) {
O << "__imp_";
// popl %some_register
// addl $_GLOBAL_ADDRESS_TABLE_ + [.-piclabel], %some_register
O << " + [.-"
- << computePICLabel(getFunctionNumber(), TAI, Subtarget) << "]";
+ << computePICLabel(CurrentFnName, TAI, Subtarget) << "]";
if (isCallOp)
O << "@PLT";
}
void X86ATTAsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op) {
- std::string label = computePICLabel(getFunctionNumber(), TAI, Subtarget);
+ std::string label = computePICLabel(CurrentFnName, TAI, Subtarget);
O << label << "\n" << label << ":";
}
case MachineOperand::MO_JumpTableIndex: {
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
if (!isMemOp) O << "OFFSET ";
- O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber()
- << "_" << MO.getJumpTableIndex();
+ O << TAI->getPrivateGlobalPrefix() << "JTI" << MO.getJumpTableIndex()
+ << '_' << CurrentFnName;
return;
}
case MachineOperand::MO_ConstantPoolIndex: {
bool isMemOp = Modifier && !strcmp(Modifier, "mem");
if (!isMemOp) O << "OFFSET ";
O << "[" << TAI->getPrivateGlobalPrefix() << "CPI"
- << getFunctionNumber() << "_" << MO.getConstantPoolIndex();
+ << MO.getConstantPoolIndex() << '_' << CurrentFnName;
int Offset = MO.getOffset();
if (Offset > 0)
O << " + " << Offset;
}
void X86IntelAsmPrinter::printPICLabel(const MachineInstr *MI, unsigned Op) {
- O << "\"L" << getFunctionNumber() << "$pb\"\n";
- O << "\"L" << getFunctionNumber() << "$pb\":";
+ O << "\"L" "pb$" << CurrentFnName << "\"\n";
+ O << "\"L" "pb$" << CurrentFnName << "\":";
}
bool X86IntelAsmPrinter::printAsmMRegister(const MachineOperand &MO,
; RUN: llvm-upgrade < %s | llvm-as | llc -march=x86 | %prcontext je 1 | \
-; RUN: grep BB1_1:
+; RUN: grep BB1_main:
%str = internal constant [14 x sbyte] c"Hello world!\0A\00" ; <[14 x sbyte]*> [#uses=1]
%str = internal constant [13 x sbyte] c"Blah world!\0A\00" ; <[13 x sbyte]*> [#uses=1]
; PR1075
; RUN: llvm-as < %s | llc -mtriple=x86_64-apple-darwin | \
-; RUN: %prcontext {mulss LCPI1_3} 1 | grep mulss | count 1
+; RUN: %prcontext {mulss LCPI3__foo} 1 | grep mulss | count 1
define float @foo(float %x) {
%tmp1 = mul float %x, 3.000000e+00
; Test that the load of the constant is folded into the operation.
-double %test_add(double %P) {
+double %foo_add(double %P) {
%tmp.1 = add double %P, 0x405EC00000000000
ret double %tmp.1
}
-double %test_mul(double %P) {
+double %foo_mul(double %P) {
%tmp.1 = mul double %P, 0x405EC00000000000
ret double %tmp.1
}
-double %test_sub(double %P) {
+double %foo_sub(double %P) {
%tmp.1 = sub double %P, 0x405EC00000000000
ret double %tmp.1
}
-double %test_subr(double %P) {
+double %foo_subr(double %P) {
%tmp.1 = sub double 0x405EC00000000000, %P
ret double %tmp.1
}
-double %test_div(double %P) {
+double %foo_div(double %P) {
%tmp.1 = div double %P, 0x405EC00000000000
ret double %tmp.1
}
-double %test_divr(double %P) {
+double %foo_divr(double %P) {
%tmp.1 = div double 0x405EC00000000000, %P
ret double %tmp.1
}