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