asmstreamerize the .size directive for function bodies, force clients
authorChris Lattner <sabre@nondot.org>
Sat, 3 Apr 2010 22:28:33 +0000 (22:28 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 3 Apr 2010 22:28:33 +0000 (22:28 +0000)
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

include/llvm/CodeGen/AsmPrinter.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
lib/Target/Blackfin/AsmPrinter/BlackfinAsmPrinter.cpp
lib/Target/PowerPC/AsmPrinter/PPCAsmPrinter.cpp
lib/Target/SystemZ/AsmPrinter/SystemZAsmPrinter.cpp
lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp

index 93dc97b94e50b72b4d30b8f9119ed66e26facca4..79c2eb1c92898afaa8c5abb479b294e5d5c6f09e 100644 (file)
@@ -269,11 +269,6 @@ namespace llvm {
     ///
     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
     /// in bytes of the directive is specified by Size and Hi/Lo specify the
     /// labels.  This implicitly uses .set if it is available.
@@ -349,7 +344,7 @@ namespace llvm {
     virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV);
 
     /// 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
     /// exactly one predecessor and the control transfer mechanism between
index 4f45f6514d0f18538acfd4089f8e5aa619943b5a..84128168fe2f92e6ab4fa5fe11f4f3d0a141b840 100644 (file)
@@ -461,7 +461,16 @@ void AsmPrinter::EmitFunctionBody() {
   // If the target wants a .size directive for the size of the function, emit
   // it.
   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.
@@ -922,12 +931,6 @@ void AsmPrinter::EmitInt32(int Value) const {
   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
 /// in bytes of the directive is specified by Size and Hi/Lo specify the
 /// 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);
 }
 
-void AsmPrinter::printOffset(int64_t Offset) const {
+void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const {
   if (Offset > 0)
-    O << '+' << Offset;
+    OS << '+' << Offset;
   else if (Offset < 0)
-    O << Offset;
+    OS << Offset;
 }
 
 /// isBlockOnlyReachableByFallthough - Return true if the basic block has
index ba736e3c0777faf6317829dcda616e497489867e..b4aa4a46e1c5ea8764a9312bd9ff0ca7f371946a 100644 (file)
@@ -319,7 +319,7 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
       O << ":upper16:";
     O << *Mang->getSymbol(GV);
 
-    printOffset(MO.getOffset());
+    printOffset(MO.getOffset(), O);
 
     if (isCallOp && Subtarget->isTargetELF() &&
         TM.getRelocationModel() == Reloc::PIC_)
index 1c6d841cf3eb157a5b094d7e211d8d1807ed57dd..a6b48423a52931bc7b34a76c1e5e235185ffca02 100644 (file)
@@ -86,7 +86,7 @@ void BlackfinAsmPrinter::printOperand(const MachineInstr *MI, int opNum) {
     return;
   case MachineOperand::MO_GlobalAddress:
     O << *Mang->getSymbol(MO.getGlobal());
-    printOffset(MO.getOffset());
+    printOffset(MO.getOffset(), O);
     break;
   case MachineOperand::MO_ExternalSymbol:
     O << *GetExternalSymbolSymbol(MO.getSymbolName());
index 5adefd39c51bb00a6d90da20ff5a248da17c1a0a..7523b6a61716d0ab3814a5774faafec22e8be065 100644 (file)
@@ -446,7 +446,7 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) {
     
     O << *SymToPrint;
 
-    printOffset(MO.getOffset());
+    printOffset(MO.getOffset(), O);
     return;
   }
 
index b29dfcdc98462a8f0b41573b5bc59b2d6b173284..349ac3e4b18d746898ae3bdf30dc9c43a2bfbe27 100644 (file)
@@ -101,7 +101,7 @@ void SystemZAsmPrinter::printPCRelImmOperand(const MachineInstr *MI, int OpNum){
         !GV->hasLocalLinkage())
       O << "@PLT";
 
-    printOffset(MO.getOffset());
+    printOffset(MO.getOffset(), O);
     return;
   }
   case MachineOperand::MO_ExternalSymbol: {
@@ -155,7 +155,7 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
     O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
       << MO.getIndex();
 
-    printOffset(MO.getOffset());
+    printOffset(MO.getOffset(), O);
     break;
   case MachineOperand::MO_GlobalAddress:
     O << *Mang->getSymbol(MO.getGlobal());
@@ -177,7 +177,7 @@ void SystemZAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
   case SystemZII::MO_PLT:       O << "@PLT";       break;
   }
 
-  printOffset(MO.getOffset());
+  printOffset(MO.getOffset(), O);
 }
 
 void SystemZAsmPrinter::printRIAddrOperand(const MachineInstr *MI, int OpNum,
index 66bb914edde5fda251df161dfcba95792cc5b43a..5f758db9456dde6d68e678f6a3bd87fabe31df81 100644 (file)
@@ -87,7 +87,7 @@ void X86AsmPrinter::printSymbolOperand(const MachineOperand &MO) {
     break;
   case MachineOperand::MO_ConstantPoolIndex:
     O << *GetCPISymbol(MO.getIndex());
-    printOffset(MO.getOffset());
+    printOffset(MO.getOffset(), O);
     break;
   case MachineOperand::MO_GlobalAddress: {
     const GlobalValue *GV = MO.getGlobal();
@@ -136,7 +136,7 @@ void X86AsmPrinter::printSymbolOperand(const MachineOperand &MO) {
       O << *GVSym;
     else
       O << '(' << *GVSym << ')';
-    printOffset(MO.getOffset());
+    printOffset(MO.getOffset(), O);
     break;
   }
   case MachineOperand::MO_ExternalSymbol: {