asmstreamerize the .size directive for function bodies, force clients

of printOffset to pass in a stream to print to.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100296 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-04-03 22:28:33 +00:00
parent fd60b8b484
commit 0c08d09204
7 changed files with 22 additions and 24 deletions

View File

@ -269,11 +269,6 @@ namespace llvm {
/// ///
void EmitInt32(int Value) const; void EmitInt32(int Value) const;
/// EmitInt64 - Emit a long long directive and value.
///
void EmitInt64(uint64_t Value) const;
/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size /// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size
/// in bytes of the directive is specified by Size and Hi/Lo specify the /// in bytes of the directive is specified by Size and Hi/Lo specify the
/// labels. This implicitly uses .set if it is available. /// labels. This implicitly uses .set if it is available.
@ -349,7 +344,7 @@ namespace llvm {
virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
/// printOffset - This is just convenient handler for printing offsets. /// printOffset - This is just convenient handler for printing offsets.
void printOffset(int64_t Offset) const; void printOffset(int64_t Offset, raw_ostream &OS) const;
/// isBlockOnlyReachableByFallthough - Return true if the basic block has /// isBlockOnlyReachableByFallthough - Return true if the basic block has
/// exactly one predecessor and the control transfer mechanism between /// exactly one predecessor and the control transfer mechanism between

View File

@ -461,7 +461,16 @@ void AsmPrinter::EmitFunctionBody() {
// If the target wants a .size directive for the size of the function, emit // If the target wants a .size directive for the size of the function, emit
// it. // it.
if (MAI->hasDotTypeDotSizeDirective()) { if (MAI->hasDotTypeDotSizeDirective()) {
O << "\t.size\t" << *CurrentFnSym << ", .-" << *CurrentFnSym << '\n'; // Create a symbol for the end of function, so we can get the size as
// difference between the function label and the temp label.
MCSymbol *FnEndLabel = OutContext.CreateTempSymbol();
OutStreamer.EmitLabel(FnEndLabel);
const MCExpr *SizeExp =
MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel, OutContext),
MCSymbolRefExpr::Create(CurrentFnSym, OutContext),
OutContext);
OutStreamer.EmitELFSize(CurrentFnSym, SizeExp);
} }
// Emit post-function debug information. // Emit post-function debug information.
@ -922,12 +931,6 @@ void AsmPrinter::EmitInt32(int Value) const {
OutStreamer.EmitIntValue(Value, 4, 0/*addrspace*/); OutStreamer.EmitIntValue(Value, 4, 0/*addrspace*/);
} }
/// EmitInt64 - Emit a long long directive and value.
///
void AsmPrinter::EmitInt64(uint64_t Value) const {
OutStreamer.EmitIntValue(Value, 8, 0/*addrspace*/);
}
/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size /// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size
/// in bytes of the directive is specified by Size and Hi/Lo specify the /// in bytes of the directive is specified by Size and Hi/Lo specify the
/// labels. This implicitly uses .set if it is available. /// labels. This implicitly uses .set if it is available.
@ -1822,11 +1825,11 @@ void AsmPrinter::EmitVisibility(MCSymbol *Sym, unsigned Visibility) const {
OutStreamer.EmitSymbolAttribute(Sym, Attr); OutStreamer.EmitSymbolAttribute(Sym, Attr);
} }
void AsmPrinter::printOffset(int64_t Offset) const { void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const {
if (Offset > 0) if (Offset > 0)
O << '+' << Offset; OS << '+' << Offset;
else if (Offset < 0) else if (Offset < 0)
O << Offset; OS << Offset;
} }
/// isBlockOnlyReachableByFallthough - Return true if the basic block has /// isBlockOnlyReachableByFallthough - Return true if the basic block has

View File

@ -319,7 +319,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
O << ":upper16:"; O << ":upper16:";
O << *Mang->getSymbol(GV); O << *Mang->getSymbol(GV);
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
if (isCallOp && Subtarget->isTargetELF() && if (isCallOp && Subtarget->isTargetELF() &&
TM.getRelocationModel() == Reloc::PIC_) TM.getRelocationModel() == Reloc::PIC_)

View File

@ -86,7 +86,7 @@ void BlackfinAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
return; return;
case MachineOperand::MO_GlobalAddress: case MachineOperand::MO_GlobalAddress:
O << *Mang->getSymbol(MO.getGlobal()); O << *Mang->getSymbol(MO.getGlobal());
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
break; break;
case MachineOperand::MO_ExternalSymbol: case MachineOperand::MO_ExternalSymbol:
O << *GetExternalSymbolSymbol(MO.getSymbolName()); O << *GetExternalSymbolSymbol(MO.getSymbolName());

View File

@ -446,7 +446,7 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) {
O << *SymToPrint; O << *SymToPrint;
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
return; return;
} }

View File

@ -101,7 +101,7 @@ void SystemZAsmPrinter::printPCRelImmOperand(const MachineInstr *MI, int OpNum){
!GV->hasLocalLinkage()) !GV->hasLocalLinkage())
O << "@PLT"; O << "@PLT";
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
return; return;
} }
case MachineOperand::MO_ExternalSymbol: { case MachineOperand::MO_ExternalSymbol: {
@ -155,7 +155,7 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
<< MO.getIndex(); << MO.getIndex();
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
break; break;
case MachineOperand::MO_GlobalAddress: case MachineOperand::MO_GlobalAddress:
O << *Mang->getSymbol(MO.getGlobal()); O << *Mang->getSymbol(MO.getGlobal());
@ -177,7 +177,7 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
case SystemZII::MO_PLT: O << "@PLT"; break; case SystemZII::MO_PLT: O << "@PLT"; break;
} }
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
} }
void SystemZAsmPrinter::printRIAddrOperand(const MachineInstr *MI, int OpNum, void SystemZAsmPrinter::printRIAddrOperand(const MachineInstr *MI, int OpNum,

View File

@ -87,7 +87,7 @@ void X86AsmPrinter::printSymbolOperand(const MachineOperand &MO) {
break; break;
case MachineOperand::MO_ConstantPoolIndex: case MachineOperand::MO_ConstantPoolIndex:
O << *GetCPISymbol(MO.getIndex()); O << *GetCPISymbol(MO.getIndex());
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
break; break;
case MachineOperand::MO_GlobalAddress: { case MachineOperand::MO_GlobalAddress: {
const GlobalValue *GV = MO.getGlobal(); const GlobalValue *GV = MO.getGlobal();
@ -136,7 +136,7 @@ void X86AsmPrinter::printSymbolOperand(const MachineOperand &MO) {
O << *GVSym; O << *GVSym;
else else
O << '(' << *GVSym << ')'; O << '(' << *GVSym << ')';
printOffset(MO.getOffset()); printOffset(MO.getOffset(), O);
break; break;
} }
case MachineOperand::MO_ExternalSymbol: { case MachineOperand::MO_ExternalSymbol: {