ARMAsmPrinter.cpp revision b01c4bbb4573e0007444e218b683840e4519e0c8
17bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola//===-- ARMAsmPrinter.cpp - ARM LLVM assembly writer ----------------------===// 27bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// 37bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// The LLVM Compiler Infrastructure 47bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// 57bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// This file was developed by the "Instituto Nokia de Tecnologia" and 67bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// is distributed under the University of Illinois Open Source 77bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// License. See LICENSE.TXT for details. 87bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// 97bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola//===----------------------------------------------------------------------===// 107bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// 117bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// This file contains a printer that converts from our internal representation 127bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// of machine-dependent LLVM code to GAS-format ARM assembly language. 137bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola// 147bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola//===----------------------------------------------------------------------===// 157bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 167bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "ARM.h" 177bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "ARMInstrInfo.h" 187bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/Constants.h" 197bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/DerivedTypes.h" 207bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/Module.h" 217bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/Assembly/Writer.h" 227bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/CodeGen/AsmPrinter.h" 237bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/CodeGen/MachineFunctionPass.h" 247bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/CodeGen/MachineConstantPool.h" 257bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/CodeGen/MachineInstr.h" 26b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola#include "llvm/Target/TargetData.h" 277bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/Target/TargetMachine.h" 287bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/Support/Mangler.h" 297bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/ADT/Statistic.h" 307bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/ADT/StringExtras.h" 317bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/Support/CommandLine.h" 327bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "llvm/Support/MathExtras.h" 337bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include <cctype> 347bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include <iostream> 357bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolausing namespace llvm; 367bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 377bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolanamespace { 387bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola Statistic<> EmittedInsts("asm-printer", "Number of machine instrs printed"); 397bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 407bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola struct ARMAsmPrinter : public AsmPrinter { 417bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola ARMAsmPrinter(std::ostream &O, TargetMachine &TM) : AsmPrinter(O, TM) { 427bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola Data16bitsDirective = "\t.half\t"; 437bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola Data32bitsDirective = "\t.word\t"; 447bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola Data64bitsDirective = 0; 457bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola ZeroDirective = "\t.skip\t"; 467bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola CommentString = "!"; 477bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola ConstantPoolSection = "\t.section \".rodata\",#alloc\n"; 48a1334cdfb2afb44a1f2b952391e1b2fecb1d4bd8Rafael Espindola AlignmentIsInBytes = false; 497bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola } 507bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 517bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola /// We name each basic block in a Function with a unique number, so 527bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola /// that we can consistently refer to them later. This is cleared 537bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola /// at the beginning of each call to runOnMachineFunction(). 547bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola /// 557bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola typedef std::map<const Value *, unsigned> ValueMapTy; 567bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola ValueMapTy NumberForBB; 577bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 587bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola virtual const char *getPassName() const { 597bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola return "ARM Assembly Printer"; 607bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola } 617bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 62a4e64359aafaf23e440e9dc171859daef1995f1bRafael Espindola void printMemRegImm(const MachineInstr *MI, unsigned OpNo) { 63a4e64359aafaf23e440e9dc171859daef1995f1bRafael Espindola printOperand(MI, OpNo + 1); 64a4e64359aafaf23e440e9dc171859daef1995f1bRafael Espindola O << ", "; 65a4e64359aafaf23e440e9dc171859daef1995f1bRafael Espindola printOperand(MI, OpNo); 66a4e64359aafaf23e440e9dc171859daef1995f1bRafael Espindola } 67a4e64359aafaf23e440e9dc171859daef1995f1bRafael Espindola 687bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola void printOperand(const MachineInstr *MI, int opNum); 697bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola void printMemOperand(const MachineInstr *MI, int opNum, 707bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola const char *Modifier = 0); 717bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola void printCCOperand(const MachineInstr *MI, int opNum); 727bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 737bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola bool printInstruction(const MachineInstr *MI); // autogenerated. 747bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola bool runOnMachineFunction(MachineFunction &F); 757bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola bool doInitialization(Module &M); 767bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola bool doFinalization(Module &M); 777bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola }; 787bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} // end of anonymous namespace 797bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 807bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola#include "ARMGenAsmWriter.inc" 817bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 827bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// createARMCodePrinterPass - Returns a pass that prints the ARM 837bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// assembly code for a MachineFunction to the given output stream, 847bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// using the given target machine description. This should work 857bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// regardless of whether the function is in SSA form. 867bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// 877bc59bc3952ad7842b1e079753deb32217a768a3Rafael EspindolaFunctionPass *llvm::createARMCodePrinterPass(std::ostream &o, 887bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola TargetMachine &tm) { 897bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola return new ARMAsmPrinter(o, tm); 907bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} 917bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 927bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// runOnMachineFunction - This uses the printMachineInstruction() 937bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// method to print assembly for each instruction. 947bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola/// 957bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolabool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { 964b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola SetupMachineFunction(MF); 974b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola O << "\n\n"; 984b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola 994b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola // Print out constants referenced by the function 1004b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola EmitConstantPool(MF.getConstantPool()); 1014b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola 1024b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola // Print out jump tables referenced by the function 1034b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola EmitJumpTableInfo(MF.getJumpTableInfo()); 1044b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola 1054b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola // Print out labels for the function. 1064b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola const Function *F = MF.getFunction(); 1074b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola switch (F->getLinkage()) { 1084b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola default: assert(0 && "Unknown linkage type!"); 1094b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola case Function::InternalLinkage: 1104b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola SwitchToTextSection("\t.text", F); 1114b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola break; 1124b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola case Function::ExternalLinkage: 1134b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola SwitchToTextSection("\t.text", F); 1144b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola O << "\t.globl\t" << CurrentFnName << "\n"; 1154b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola break; 1164b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola case Function::WeakLinkage: 1174b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola case Function::LinkOnceLinkage: 1184b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola assert(0 && "Not implemented"); 1194b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola break; 1204b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola } 121a1334cdfb2afb44a1f2b952391e1b2fecb1d4bd8Rafael Espindola EmitAlignment(2, F); 1224b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola O << CurrentFnName << ":\n"; 1234b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola 1244b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola // Print out code for the function. 1254b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); 1264b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola I != E; ++I) { 1274b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola // Print a label for the basic block. 1284b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola if (I != MF.begin()) { 1294b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola printBasicBlockLabel(I, true); 1304b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola O << '\n'; 1314b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola } 1324b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end(); 1334b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola II != E; ++II) { 1344b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola // Print the assembly for the instruction. 1354b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola O << "\t"; 1364b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola printInstruction(II); 1374b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola } 1384b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola } 1394b442b528a50ef06cd75f0e7c41ad57426175bccRafael Espindola 1407bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola return false; 1417bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} 1427bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 1437bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolavoid ARMAsmPrinter::printOperand(const MachineInstr *MI, int opNum) { 1442f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola const MachineOperand &MO = MI->getOperand (opNum); 1452f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola const MRegisterInfo &RI = *TM.getRegisterInfo(); 1462f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola switch (MO.getType()) { 1472f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola case MachineOperand::MO_Register: 1482f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola if (MRegisterInfo::isPhysicalRegister(MO.getReg())) 1492f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola O << LowercaseString (RI.get(MO.getReg()).Name); 1502f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola else 1512f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola assert(0 && "not implemented"); 1522f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola break; 1532f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola case MachineOperand::MO_Immediate: 1542f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola O << "#" << (int)MO.getImmedValue(); 1552f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola break; 1562f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola case MachineOperand::MO_MachineBasicBlock: 1572f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola assert(0 && "not implemented"); 1582f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola abort(); 1592f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola return; 16084b19be6ab9544f72eafb11048a1121f5ea77c95Rafael Espindola case MachineOperand::MO_GlobalAddress: { 16184b19be6ab9544f72eafb11048a1121f5ea77c95Rafael Espindola GlobalValue *GV = MO.getGlobal(); 16284b19be6ab9544f72eafb11048a1121f5ea77c95Rafael Espindola std::string Name = Mang->getValueName(GV); 16384b19be6ab9544f72eafb11048a1121f5ea77c95Rafael Espindola O << Name; 16484b19be6ab9544f72eafb11048a1121f5ea77c95Rafael Espindola } 1652f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola break; 1662f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola case MachineOperand::MO_ExternalSymbol: 1672f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola assert(0 && "not implemented"); 1682f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola abort(); 1692f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola break; 1702f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola case MachineOperand::MO_ConstantPoolIndex: 1712f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola assert(0 && "not implemented"); 1722f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola abort(); 1732f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola break; 1742f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola default: 1752f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola O << "<unknown operand type>"; abort (); break; 1762f99b6bd9601ae8d4fd248f9bb701283795c38a8Rafael Espindola } 1777bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} 1787bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 1797bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolavoid ARMAsmPrinter::printMemOperand(const MachineInstr *MI, int opNum, 1807bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola const char *Modifier) { 1817bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola assert(0 && "not implemented"); 1827bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} 1837bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 1847bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolavoid ARMAsmPrinter::printCCOperand(const MachineInstr *MI, int opNum) { 1857bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola assert(0 && "not implemented"); 1867bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} 1877bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 1887bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolabool ARMAsmPrinter::doInitialization(Module &M) { 1897bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola Mang = new Mangler(M); 1907bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola return false; // success 1917bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} 1927bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola 1937bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindolabool ARMAsmPrinter::doFinalization(Module &M) { 194b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola const TargetData *TD = TM.getTargetData(); 195b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola 196b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 197b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola I != E; ++I) { 198b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola if (!I->hasInitializer()) // External global require no code 199b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola continue; 200b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola 201b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola if (EmitSpecialLLVMGlobal(I)) 202b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola continue; 203b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola 204b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola O << "\n\n"; 205b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola std::string name = Mang->getValueName(I); 206b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola Constant *C = I->getInitializer(); 207b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola unsigned Size = TD->getTypeSize(C->getType()); 208b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola unsigned Align = TD->getTypeAlignment(C->getType()); 209b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola 210b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola assert (I->getLinkage() == GlobalValue::ExternalLinkage); 211b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola O << "\t.globl " << name << "\n"; 212b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola 213b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola assert (!C->isNullValue()); 214b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola SwitchToDataSection(".data", I); 215b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola 216b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola EmitAlignment(Align, I); 217b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola O << "\t.type " << name << ", %object\n"; 218b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola O << "\t.size " << name << ", " << Size << "\n"; 219b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola O << name << ":\n"; 220b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola EmitGlobalConstant(C); 221b01c4bbb4573e0007444e218b683840e4519e0c8Rafael Espindola } 2227bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola AsmPrinter::doFinalization(M); 2237bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola return false; // success 2247bc59bc3952ad7842b1e079753deb32217a768a3Rafael Espindola} 225