mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-03 11:08:32 +00:00
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:
parent
fd60b8b484
commit
0c08d09204
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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_)
|
||||||
|
@ -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());
|
||||||
|
@ -446,7 +446,7 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) {
|
|||||||
|
|
||||||
O << *SymToPrint;
|
O << *SymToPrint;
|
||||||
|
|
||||||
printOffset(MO.getOffset());
|
printOffset(MO.getOffset(), O);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user