AsmPrinter.cpp revision a408333857f9fc404c69a4954590c348caef9e0d
193fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev//===-- AsmPrinter.cpp - Common AsmPrinter code ---------------------------===//
293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev//
393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev//                     The LLVM Compiler Infrastructure
46d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan//
56d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan// This file is distributed under the University of Illinois Open Source
66d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan// License. See LICENSE.TXT for details.
76d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan//
86d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan//===----------------------------------------------------------------------===//
96d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan//
106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan// This file implements the AsmPrinter class.
116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan//
126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan//===----------------------------------------------------------------------===//
136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#define DEBUG_TYPE "asm-printer"
156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/AsmPrinter.h"
166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "DwarfDebug.h"
176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "DwarfException.h"
186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/Module.h"
196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/GCMetadataPrinter.h"
206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/MachineConstantPool.h"
216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/MachineFrameInfo.h"
226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/MachineFunction.h"
236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/MachineJumpTableInfo.h"
246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/MachineLoopInfo.h"
256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/CodeGen/MachineModuleInfo.h"
266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/Analysis/ConstantFolding.h"
276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/Analysis/DebugInfo.h"
286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/MC/MCAsmInfo.h"
296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/MC/MCContext.h"
306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/MC/MCExpr.h"
316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/MC/MCInst.h"
326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/MC/MCSection.h"
336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/MC/MCStreamer.h"
346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/MC/MCSymbol.h"
356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/Target/Mangler.h"
366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/Target/TargetData.h"
376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/Target/TargetInstrInfo.h"
38c427f5e8ab231012d7663a0ee408f1225bac971azhanyong.wan#include "llvm/Target/TargetLowering.h"
39c427f5e8ab231012d7663a0ee408f1225bac971azhanyong.wan#include "llvm/Target/TargetLoweringObjectFile.h"
406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/Target/TargetRegisterInfo.h"
416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/ADT/SmallString.h"
426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan#include "llvm/ADT/Statistic.h"
43535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan#include "llvm/Support/ErrorHandling.h"
44535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan#include "llvm/Support/Format.h"
45535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wan#include "llvm/Support/Timer.h"
46535de5338c3a76bc75905694ac15731e3f0bfc8dzhanyong.wanusing namespace llvm;
47673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosev
48673a0cb9079f8f37bd61588a3160e12daf70ec44vladlosevstatic const char *DWARFGroupName = "DWARF Emission";
49733a54a398766289b74cf3daebe083d7115cf388zhanyong.wanstatic const char *DbgTimerName = "DWARF Debug Writer";
509644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanstatic const char *EHTimerName = "DWARF Exception Writer";
51733a54a398766289b74cf3daebe083d7115cf388zhanyong.wan
529644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanSTATISTIC(EmittedInsts, "Number of machine instrs printed");
539644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
549644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanchar AsmPrinter::ID = 0;
559644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
56357070773163979334f922aea127388de17c26fakosak@google.comtypedef DenseMap<GCStrategy*,GCMetadataPrinter*> gcp_map_type;
57357070773163979334f922aea127388de17c26fakosak@google.comstatic gcp_map_type &getGCMap(void *&P) {
58357070773163979334f922aea127388de17c26fakosak@google.com  if (P == 0)
59357070773163979334f922aea127388de17c26fakosak@google.com    P = new gcp_map_type();
60357070773163979334f922aea127388de17c26fakosak@google.com  return *(gcp_map_type*)P;
61357070773163979334f922aea127388de17c26fakosak@google.com}
62357070773163979334f922aea127388de17c26fakosak@google.com
63357070773163979334f922aea127388de17c26fakosak@google.com
646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanAsmPrinter::AsmPrinter(TargetMachine &tm, MCStreamer &Streamer)
656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  : MachineFunctionPass(&ID),
669644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    TM(tm), MAI(tm.getMCAsmInfo()),
679644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    OutContext(Streamer.getContext()),
689644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    OutStreamer(Streamer),
699644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    LastMI(0), LastFn(0), Counter(~0U), SetCounter(0) {
709644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  DD = 0; DE = 0; MMI = 0; LI = 0;
719644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  GCMetadataPrinters = 0;
729644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  VerboseAsm = Streamer.isVerboseAsm();
739644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan}
749644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
759644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wanAsmPrinter::~AsmPrinter() {
769644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  assert(DD == 0 && DE == 0 && "Debug/EH info didn't get finalized");
779644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
789644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  if (GCMetadataPrinters != 0) {
799644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
809644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
819644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    for (gcp_map_type::iterator I = GCMap.begin(), E = GCMap.end(); I != E; ++I)
826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      delete I->second;
839644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    delete &GCMap;
846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    GCMetadataPrinters = 0;
856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  delete &OutStreamer;
886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// getFunctionNumber - Return a unique ID for the current function.
916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan///
926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanunsigned AsmPrinter::getFunctionNumber() const {
936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  return MF->getFunctionNumber();
946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanconst TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const {
976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  return TM.getTargetLowering()->getObjFileLowering();
986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// getTargetData - Return information about data layout.
1026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanconst TargetData &AsmPrinter::getTargetData() const {
1036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  return *TM.getTargetData();
1046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
1056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// getCurrentSection() - Return the current section we are emitting to.
1076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanconst MCSection *AsmPrinter::getCurrentSection() const {
1086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  return OutStreamer.getCurrentSection();
1096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
1106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
1146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  AU.setPreservesAll();
1156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  MachineFunctionPass::getAnalysisUsage(AU);
1166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  AU.addRequired<MachineModuleInfo>();
1176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  AU.addRequired<GCModuleInfo>();
1186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (isVerbose())
1196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    AU.addRequired<MachineLoopInfo>();
1206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
1216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanbool AsmPrinter::doInitialization(Module &M) {
1236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  MMI = getAnalysisIfAvailable<MachineModuleInfo>();
1246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  MMI->AnalyzeModule(M);
1256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Initialize TargetLoweringObjectFile.
1276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
1286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    .Initialize(OutContext, TM);
1296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  Mang = new Mangler(OutContext, *TM.getTargetData());
1316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Allow the target to emit any magic that it wants at the start of the file.
1336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitStartOfAsmFile(M);
1346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Very minimal debug info. It is ignored if we emit actual debug info. If we
1366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // don't, this at least helps the user find where a global came from.
1376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->hasSingleParameterDotFile()) {
1386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // .file "foo.c"
1396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitFileDirective(M.getModuleIdentifier());
1406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
1416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
1436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  assert(MI && "AsmPrinter didn't require GCModuleInfo?");
1446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I)
1456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
1466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MP->beginAssembly(*this);
1476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1486d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Emit module-level inline asm if it exists.
1496d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (!M.getModuleInlineAsm().empty()) {
1506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.AddComment("Start of file scope inline assembly");
1516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.AddBlankLine();
1526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitInlineAsm(M.getModuleInlineAsm(), 0/*no loc cookie*/);
15345577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    OutStreamer.AddComment("End of file scope inline assembly");
15493fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    OutStreamer.AddBlankLine();
15593fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  }
1566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
1576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->doesSupportDebugInformation())
15845577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    DD = new DwarfDebug(this, &M);
15993fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev
16093fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  if (MAI->doesSupportExceptionHandling())
1616d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    DE = new DwarfException(this);
1626d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
16345577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  return false;
16493fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev}
16593fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev
1666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const {
1676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  switch ((GlobalValue::LinkageTypes)Linkage) {
16845577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  case GlobalValue::CommonLinkage:
16993fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  case GlobalValue::LinkOnceAnyLinkage:
17093fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  case GlobalValue::LinkOnceODRLinkage:
1716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case GlobalValue::WeakAnyLinkage:
1726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case GlobalValue::WeakODRLinkage:
17345577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  case GlobalValue::LinkerPrivateLinkage:
17493fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    if (MAI->getWeakDefDirective() != 0) {
17593fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev      // .globl _foo
1766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
1776d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // .weak_definition _foo
17845577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev      OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
17993fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    } else if (const char *LinkOnce = MAI->getLinkOnceDirective()) {
18093fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev      // .globl _foo
1816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
1826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // FIXME: linkonce should be a section attribute, handled by COFF Section
18345577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev      // assignment.
18493fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev      // http://sourceware.org/binutils/docs-2.20/as/Linkonce.html#Linkonce
18593fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev      // .linkonce discard
1866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // FIXME: It would be nice to use .linkonce samesize for non-common
1876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // globals.
18845577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev      OutStreamer.EmitRawText(StringRef(LinkOnce));
18993fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    } else {
19093fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev      // .weak _foo
1916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Weak);
1926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
19345577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    break;
19493fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  case GlobalValue::DLLExportLinkage:
19593fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  case GlobalValue::AppendingLinkage:
1966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // FIXME: appending linkage variables should go into a section of
1976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // their name or something.  For now, just emit them as external.
19845577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  case GlobalValue::ExternalLinkage:
19993fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    // If external or appending, declare as a global symbol.
20093fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    // .globl _foo
2016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
2026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    break;
2036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case GlobalValue::PrivateLinkage:
2046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case GlobalValue::InternalLinkage:
2056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    break;
2066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  default:
2076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    llvm_unreachable("Unknown linkage type!");
2086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
2096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
2106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitGlobalVariable - Emit the specified global variable to the .s file.
2136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
2146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (!GV->hasInitializer())   // External globals require no code.
2156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return;
2166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
217fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  // Check to see if this is a special global used by LLVM, if so, emit it.
2186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (EmitSpecialLLVMGlobal(GV))
2196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return;
2206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  MCSymbol *GVSym = Mang->getSymbol(GV);
2226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitVisibility(GVSym, GV->getVisibility());
2236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->hasDotTypeDotSizeDirective())
2256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitSymbolAttribute(GVSym, MCSA_ELF_TypeObject);
2266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
2286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const TargetData *TD = TM.getTargetData();
2306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  unsigned Size = TD->getTypeAllocSize(GV->getType()->getElementType());
2316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // If the alignment is specified, we *must* obey it.  Overaligning a global
2339644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // with a specified alignment is a prompt way to break globals emitted to
2349644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  // sections and expected to be contiguous (e.g. ObjC metadata).
2356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  unsigned AlignLog;
2366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (unsigned GVAlign = GV->getAlignment())
2376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    AlignLog = Log2_32(GVAlign);
2386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  else
2396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    AlignLog = TD->getPreferredAlignmentLog(GV);
2406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Handle common and BSS local symbols (.lcomm).
2426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (GVKind.isCommon() || GVKind.isBSSLocal()) {
2436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
2446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (isVerbose()) {
2466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      WriteAsOperand(OutStreamer.GetCommentOS(), GV,
2476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                     /*PrintType=*/false, GV->getParent());
2486d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.GetCommentOS() << '\n';
249fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev    }
2506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Handle common symbols.
2526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (GVKind.isCommon()) {
2536d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // .comm _foo, 42, 4
2546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
2556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      return;
2566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
2576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2586d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Handle local BSS symbols.
2596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (MAI->hasMachoZeroFillDirective()) {
2606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      const MCSection *TheSection =
2616d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM);
2626d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // .zerofill __DATA, __bss, _foo, 400, 5
2636d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog);
2646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      return;
2656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
2666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (MAI->hasLCOMMDirective()) {
2686d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // .lcomm _foo, 42
2696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitLocalCommonSymbol(GVSym, Size);
2706d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      return;
2716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
2726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2736d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // .local _foo
2749644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Local);
2759644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    // .comm _foo, 42, 4
2766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
2776d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return;
2786d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
2796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const MCSection *TheSection =
2816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    getObjFileLowering().SectionForGlobal(GV, GVKind, Mang, TM);
2826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2836d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Handle the zerofill directive on darwin, which is a special form of BSS
2846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // emission.
2856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) {
2866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // .globl _foo
2876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
2886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // .zerofill __DATA, __common, _foo, 400, 5
2896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog);
2906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return;
2916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
292fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev
2936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OutStreamer.SwitchSection(TheSection);
2946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitLinkage(GV->getLinkage(), GVSym);
2966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitAlignment(AlignLog, GV);
2976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
2986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (isVerbose()) {
2996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    WriteAsOperand(OutStreamer.GetCommentOS(), GV,
3006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                   /*PrintType=*/false, GV->getParent());
3016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.GetCommentOS() << '\n';
3026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
3036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OutStreamer.EmitLabel(GVSym);
3046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitGlobalConstant(GV->getInitializer());
3066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->hasDotTypeDotSizeDirective())
3086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // .size foo, 42
3099644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    OutStreamer.EmitELFSize(GVSym, MCConstantExpr::Create(Size, OutContext));
3109644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
3116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OutStreamer.AddBlankLine();
3126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
3136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitFunctionHeader - This method emits the header for the current
3156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// function.
3166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitFunctionHeader() {
3176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Print out constants referenced by the function
3186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitConstantPool();
3196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Print the 'header' of function.
3216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const Function *F = MF->getFunction();
3226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, TM));
3246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitVisibility(CurrentFnSym, F->getVisibility());
3256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitLinkage(F->getLinkage(), CurrentFnSym);
3276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitAlignment(MF->getAlignment(), F);
3286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
329fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  if (MAI->hasDotTypeDotSizeDirective())
3306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
3316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (isVerbose()) {
3336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    WriteAsOperand(OutStreamer.GetCommentOS(), F,
3346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                   /*PrintType=*/false, F->getParent());
3356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.GetCommentOS() << '\n';
3366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
3376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Emit the CurrentFnSym.  This is a virtual function to allow targets to
3396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // do their wild and crazy things as required.
3406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitFunctionEntryLabel();
3416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // If the function had address-taken blocks that got deleted, then we have
3436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // references to the dangling symbols.  Emit them at the start of the function
3446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // so that we don't get references to undefined symbols.
3456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  std::vector<MCSymbol*> DeadBlockSyms;
3466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  MMI->takeDeletedSymbolsForFunction(F, DeadBlockSyms);
3476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (unsigned i = 0, e = DeadBlockSyms.size(); i != e; ++i) {
3489644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    OutStreamer.AddComment("Address taken block that was later removed");
3499644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    OutStreamer.EmitLabel(DeadBlockSyms[i]);
3506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
3516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Add some workaround for linkonce linkage on Cygwin\MinGW.
3536d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->getLinkOnceDirective() != 0 &&
3546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      (F->hasLinkOnceLinkage() || F->hasWeakLinkage())) {
3556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // FIXME: What is this?
3566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    MCSymbol *FakeStub =
3576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutContext.GetOrCreateSymbol(Twine("Lllvm$workaround$fake$stub$")+
3586d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                   CurrentFnSym->getName());
3596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitLabel(FakeStub);
3606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
3616d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3626d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Emit pre-function debug and/or EH information.
3636d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (DE) {
3646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (TimePassesIsEnabled) {
3656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      NamedRegionTimer T(EHTimerName, DWARFGroupName);
3666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DE->BeginFunction(MF);
3676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else {
3686d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DE->BeginFunction(MF);
3696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
370fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  }
3716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (DD) {
3726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (TimePassesIsEnabled) {
3736d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      NamedRegionTimer T(DbgTimerName, DWARFGroupName);
3746d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DD->beginFunction(MF);
3756d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else {
3766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DD->beginFunction(MF);
3776d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
3786d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
3796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
3806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
3826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// function.  This can be overridden by targets as required to do custom stuff.
3836d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitFunctionEntryLabel() {
3846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OutStreamer.EmitLabel(CurrentFnSym);
3856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
3866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitComments - Pretty-print comments for instructions.
3896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanstatic void EmitComments(const MachineInstr &MI, raw_ostream &CommentOS) {
3909644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  const MachineFunction *MF = MI.getParent()->getParent();
3919644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  const TargetMachine &TM = MF->getTarget();
3926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
3936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  DebugLoc DL = MI.getDebugLoc();
3946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (!DL.isUnknown()) {          // Print source line info.
3956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    DIScope Scope(DL.getScope(MF->getFunction()->getContext()));
3966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Omit the directory, because it's likely to be long and uninteresting.
3976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (Scope.Verify())
3986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << Scope.getFilename();
3996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    else
4006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << "<unknown>";
4016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    CommentOS << ':' << DL.getLine();
4026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (DL.getCol() != 0)
4036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << ':' << DL.getCol();
4046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    CommentOS << '\n';
4056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
4066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Check for spills and reloads
4086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  int FI;
4096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const MachineFrameInfo *FrameInfo = MF->getFrameInfo();
4116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // We assume a single instruction only has a spill or reload, not
4136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // both.
414fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  const MachineMemOperand *MMO;
4156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (TM.getInstrInfo()->isLoadFromStackSlotPostFE(&MI, FI)) {
4166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (FrameInfo->isSpillSlotObjectIndex(FI)) {
4176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MMO = *MI.memoperands_begin();
4186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << MMO->getSize() << "-byte Reload\n";
4196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
4206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  } else if (TM.getInstrInfo()->hasLoadFromStackSlot(&MI, MMO, FI)) {
4216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (FrameInfo->isSpillSlotObjectIndex(FI))
4226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << MMO->getSize() << "-byte Folded Reload\n";
4236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  } else if (TM.getInstrInfo()->isStoreToStackSlotPostFE(&MI, FI)) {
4246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (FrameInfo->isSpillSlotObjectIndex(FI)) {
4256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MMO = *MI.memoperands_begin();
4266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << MMO->getSize() << "-byte Spill\n";
4276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
4286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  } else if (TM.getInstrInfo()->hasStoreToStackSlot(&MI, MMO, FI)) {
4296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (FrameInfo->isSpillSlotObjectIndex(FI))
4306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << MMO->getSize() << "-byte Folded Spill\n";
4316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
4326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Check for spill-induced copies
4346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  unsigned SrcReg, DstReg, SrcSubIdx, DstSubIdx;
4359644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  if (TM.getInstrInfo()->isMoveInstr(MI, SrcReg, DstReg,
4369644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan                                     SrcSubIdx, DstSubIdx)) {
4376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse))
4386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CommentOS << " Reload Reuse\n";
4396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
4406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
4416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitImplicitDef - This method emits the specified machine instruction
4436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// that is an implicit def.
4446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanstatic void EmitImplicitDef(const MachineInstr *MI, AsmPrinter &AP) {
4456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  unsigned RegNo = MI->getOperand(0).getReg();
4466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  AP.OutStreamer.AddComment(Twine("implicit-def: ") +
4476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                            AP.TM.getRegisterInfo()->getName(RegNo));
4486d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  AP.OutStreamer.AddBlankLine();
4496d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
4506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanstatic void EmitKill(const MachineInstr *MI, AsmPrinter &AP) {
4526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  std::string Str = "kill:";
4536d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
4546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    const MachineOperand &Op = MI->getOperand(i);
4556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    assert(Op.isReg() && "KILL instruction must have only register operands");
4566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    Str += ' ';
4576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    Str += AP.TM.getRegisterInfo()->getName(Op.getReg());
4586d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    Str += (Op.isDef() ? "<def>" : "<kill>");
4596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
4606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  AP.OutStreamer.AddComment(Str);
461fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  AP.OutStreamer.AddBlankLine();
4626d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
4636d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitDebugValueComment - This method handles the target-independent form
4656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// of DBG_VALUE, returning true if it was able to do so.  A false return
4666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// means the target will need to handle MI in EmitInstruction.
4676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanstatic bool EmitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
4686d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // This code handles only the 3-operand target-independent form.
4696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MI->getNumOperands() != 3)
4706d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return false;
4716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  SmallString<128> Str;
4736d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  raw_svector_ostream OS(Str);
4746d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OS << '\t' << AP.MAI->getCommentString() << "DEBUG_VALUE: ";
4756d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // cast away const; DIetc do not take const operands for some reason.
4776d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  DIVariable V(const_cast<MDNode*>(MI->getOperand(2).getMetadata()));
4786d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OS << V.getName() << " <- ";
4796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
4806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Register or immediate value. Register 0 means undef.
4816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MI->getOperand(0).isFPImm()) {
4829644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    APFloat APF = APFloat(MI->getOperand(0).getFPImm()->getValueAPF());
4839644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan    if (MI->getOperand(0).getFPImm()->getType()->isFloatTy()) {
4846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OS << (double)APF.convertToFloat();
4856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else if (MI->getOperand(0).getFPImm()->getType()->isDoubleTy()) {
4866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OS << APF.convertToDouble();
4876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else {
4886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // There is no good way to print long double.  Convert a copy to
4896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // double.  Ah well, it's only a comment.
4906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      bool ignored;
4916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      APF.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven,
4926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                  &ignored);
4936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OS << "(long double) " << APF.convertToDouble();
4946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
4956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  } else if (MI->getOperand(0).isImm()) {
4966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OS << MI->getOperand(0).getImm();
4976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  } else {
4986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    assert(MI->getOperand(0).isReg() && "Unknown operand type");
4996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (MI->getOperand(0).getReg() == 0) {
5006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // Suppress offset, it is not meaningful here.
5016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OS << "undef";
5026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // NOTE: Want this comment at start of line, don't emit with AddComment.
5036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      AP.OutStreamer.EmitRawText(OS.str());
5046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      return true;
5056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
5066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OS << AP.TM.getRegisterInfo()->getName(MI->getOperand(0).getReg());
5076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
5086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OS << '+' << MI->getOperand(1).getImm();
510fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  // NOTE: Want this comment at start of line, don't emit with AddComment.
5116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  AP.OutStreamer.EmitRawText(OS.str());
5126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  return true;
5136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
5146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitFunctionBody - This method emits the body and trailer for a
5166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// function.
5176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitFunctionBody() {
5186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Emit target-specific gunk before the function body.
5196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitFunctionBodyStart();
5206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  bool ShouldPrintDebugScopes = DD && MMI->hasDebugInfo();
5226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Print out code for the function.
5246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  bool HasAnyRealCode = false;
5256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end();
5266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan       I != E; ++I) {
5276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Print a label for the basic block.
5286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitBasicBlockStart(I);
5296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    for (MachineBasicBlock::const_iterator II = I->begin(), IE = I->end();
5306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan         II != IE; ++II) {
5316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // Print the assembly for the instruction.
5329644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan      if (!II->isLabel())
5339644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan        HasAnyRealCode = true;
5346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      ++EmittedInsts;
5366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (ShouldPrintDebugScopes) {
5386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	if (TimePassesIsEnabled) {
5396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	  NamedRegionTimer T(DbgTimerName, DWARFGroupName);
5406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	  DD->beginScope(II);
5416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	} else {
5426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	  DD->beginScope(II);
5436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	}
5446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      }
5456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (isVerbose())
5476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        EmitComments(*II, OutStreamer.GetCommentOS());
5486d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5496d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      switch (II->getOpcode()) {
5506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      case TargetOpcode::DBG_LABEL:
5516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      case TargetOpcode::EH_LABEL:
5526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      case TargetOpcode::GC_LABEL:
5536d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        OutStreamer.EmitLabel(II->getOperand(0).getMCSymbol());
5546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        break;
5556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      case TargetOpcode::INLINEASM:
5566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        EmitInlineAsm(II);
5576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        break;
5586d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      case TargetOpcode::DBG_VALUE:
5596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        if (isVerbose()) {
5606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan          if (!EmitDebugValueComment(II, *this))
5616d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan            EmitInstruction(II);
562fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev        }
5636d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        break;
5646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      case TargetOpcode::IMPLICIT_DEF:
5656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        if (isVerbose()) EmitImplicitDef(II, *this);
5666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        break;
5676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      case TargetOpcode::KILL:
5686d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        if (isVerbose()) EmitKill(II, *this);
5696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        break;
5706d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      default:
5716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        EmitInstruction(II);
5726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        break;
5736d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      }
5746d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5756d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (ShouldPrintDebugScopes) {
5766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	if (TimePassesIsEnabled) {
5776d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	  NamedRegionTimer T(DbgTimerName, DWARFGroupName);
5786d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	  DD->endScope(II);
5796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	} else {
5806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	  DD->endScope(II);
5816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan	}
5826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      }
5836d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
5849644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan  }
5859644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
5866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // If the function is empty and the object file uses .subsections_via_symbols,
5876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // then we need to emit *something* to the function body to prevent the
5886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // labels from collapsing together.  Just emit a noop.
5896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) {
5906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    MCInst Noop;
5916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    TM.getInstrInfo()->getNoopForMachoTarget(Noop);
5926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (Noop.getOpcode())
5936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitInstruction(Noop);
5946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    else  // Target not mc-ized yet.
5956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitRawText(StringRef("\tnop\n"));
5966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
5976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
5986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Emit target-specific gunk after the function body.
5996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitFunctionBodyEnd();
6006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // If the target wants a .size directive for the size of the function, emit
6026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // it.
6036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->hasDotTypeDotSizeDirective()) {
6046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Create a symbol for the end of function, so we can get the size as
6056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // difference between the function label and the temp label.
6066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    MCSymbol *FnEndLabel = OutContext.CreateTempSymbol();
6076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitLabel(FnEndLabel);
6086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    const MCExpr *SizeExp =
6106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(FnEndLabel, OutContext),
6116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                              MCSymbolRefExpr::Create(CurrentFnSym, OutContext),
6126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                              OutContext);
6136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitELFSize(CurrentFnSym, SizeExp);
6146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
6156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
616fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  // Emit post-function debug information.
617fbd53a53c1e01dec71c65754cf73282e4759bc40vladlosev  if (DD) {
6186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (TimePassesIsEnabled) {
6196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      NamedRegionTimer T(DbgTimerName, DWARFGroupName);
6206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DD->endFunction(MF);
6216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else {
6226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DD->endFunction(MF);
6236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
6246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
6256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (DE) {
6266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (TimePassesIsEnabled) {
6276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      NamedRegionTimer T(EHTimerName, DWARFGroupName);
6286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DE->EndFunction();
6296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else {
6306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DE->EndFunction();
6316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
6326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
6336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  MMI->EndFunction();
6346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Print out jump tables referenced by the function.
6366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitJumpTableInfo();
6376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OutStreamer.AddBlankLine();
6396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
6409644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
6419644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
6426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanbool AsmPrinter::doFinalization(Module &M) {
6436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Emit global variables.
6446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
6456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan       I != E; ++I)
6466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitGlobalVariable(I);
6476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6486d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Finalize debug and EH information.
6496d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (DE) {
6506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (TimePassesIsEnabled) {
6516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      NamedRegionTimer T(EHTimerName, DWARFGroupName);
6526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DE->EndModule();
6536d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else {
6546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DE->EndModule();
6556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
6566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    delete DE; DE = 0;
6576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
6586d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (DD) {
6596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (TimePassesIsEnabled) {
6606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      NamedRegionTimer T(DbgTimerName, DWARFGroupName);
6616d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DD->endModule();
6626d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    } else {
6636d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      DD->endModule();
6646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
6656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    delete DD; DD = 0;
6666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
6676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6686d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // If the target wants to know about weak references, print them all.
6696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->getWeakRefDirective()) {
6706d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // FIXME: This is not lazy, it would be nice to only print weak references
6716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // to stuff that is actually used.  Note that doing so would require targets
6726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // to notice uses in operands (due to constant exprs etc).  This should
6736d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // happen with the MC stuff eventually.
6746d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6756d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Print out module-level global variables here.
6766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
6776d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan         I != E; ++I) {
6786d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (!I->hasExternalWeakLinkage()) continue;
6796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitSymbolAttribute(Mang->getSymbol(I), MCSA_WeakReference);
6806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
6816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) {
6836d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (!I->hasExternalWeakLinkage()) continue;
6846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitSymbolAttribute(Mang->getSymbol(I), MCSA_WeakReference);
6856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
6866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
6876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MAI->hasSetDirective()) {
6896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.AddBlankLine();
6906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end();
6916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan         I != E; ++I) {
6926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MCSymbol *Name = Mang->getSymbol(I);
6936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal());
6956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MCSymbol *Target = Mang->getSymbol(GV);
6966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
6976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (I->hasExternalLinkage() || !MAI->getWeakRefDirective())
6986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        OutStreamer.EmitSymbolAttribute(Name, MCSA_Global);
6996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      else if (I->hasWeakLinkage())
7006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference);
7016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      else
7026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        assert(I->hasLocalLinkage() && "Invalid alias linkage");
7036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      EmitVisibility(Name, I->getVisibility());
7056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // Emit the directives as assignments aka .set:
7076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitAssignment(Name,
7086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                 MCSymbolRefExpr::Create(Target, OutContext));
7096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
7106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
7116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
7136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  assert(MI && "AsmPrinter didn't require GCModuleInfo?");
7146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
7156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I))
7166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MP->finishAssembly(*this);
7176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // If we don't have any trampolines, then we don't require stack memory
7196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // to be executable. Some targets have a directive to declare this.
7206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
7216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
7226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (const MCSection *S = MAI->getNonexecutableStackSection(OutContext))
7236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.SwitchSection(S);
7246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Allow the target to emit any magic that it wants at the end of the file,
7266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // after everything else has gone out.
7276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitEndOfAsmFile(M);
7286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  delete Mang; Mang = 0;
7306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  MMI = 0;
7316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  OutStreamer.Finish();
7336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  return false;
7346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
7356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
7376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  this->MF = &MF;
7386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Get the function symbol.
7396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  CurrentFnSym = Mang->getSymbol(MF.getFunction());
7406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
74145577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  if (isVerbose())
74293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    LI = &getAnalysis<MachineLoopInfo>();
74393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev}
7446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wannamespace {
74645577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  // SectionCPs - Keep track the alignment, constpool entries per Section.
74793fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  struct SectionCPs {
74893fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    const MCSection *S;
7496d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    unsigned Alignment;
7506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    SmallVector<unsigned, 4> CPEs;
75145577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {}
75293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  };
75393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev}
7546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitConstantPool - Print to the current output stream assembly
75645577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev/// representations of the constants in the constant pool MCP. This is
75793fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev/// used to print out constants which have been "spilled to memory" by
75893fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev/// the code generator.
7596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan///
7606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitConstantPool() {
76145577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  const MachineConstantPool *MCP = MF->getConstantPool();
76293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
76393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  if (CP.empty()) return;
7646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Calculate sections for constant pool entries. We collect entries to go into
76645577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  // the same section together to reduce amount of section switch statements.
76793fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  SmallVector<SectionCPs, 4> CPSections;
76893fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev  for (unsigned i = 0, e = CP.size(); i != e; ++i) {
7696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    const MachineConstantPoolEntry &CPE = CP[i];
7706d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    unsigned Align = CPE.getAlignment();
77145577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev
77293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    SectionKind Kind;
77393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    switch (CPE.getRelocationInfo()) {
7746d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    default: llvm_unreachable("Unknown section kind");
7756d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    case 2: Kind = SectionKind::getReadOnlyWithRel(); break;
77645577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    case 1:
77793fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev      Kind = SectionKind::getReadOnlyWithRelLocal();
77893fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev      break;
7796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    case 0:
7806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) {
78145577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    case 4:  Kind = SectionKind::getMergeableConst4(); break;
78293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    case 8:  Kind = SectionKind::getMergeableConst8(); break;
78393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    case 16: Kind = SectionKind::getMergeableConst16();break;
7846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    default: Kind = SectionKind::getMergeableConst(); break;
7856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
78645577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    }
78793fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev
78893fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    const MCSection *S = getObjFileLowering().getSectionForConstant(Kind);
7896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
7906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // The number of sections are small, just do a linear search from the
79145577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev    // last section to the first.
79293fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    bool Found = false;
79393fed47dbf8e6bc3d39d3f769cb5039551747257vladlosev    unsigned SecIdx = CPSections.size();
7946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    while (SecIdx != 0) {
7956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (CPSections[--SecIdx].S == S) {
7966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        Found = true;
7976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        break;
7986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      }
7996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
8006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (!Found) {
8016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      SecIdx = CPSections.size();
8026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CPSections.push_back(SectionCPs(S, Align));
8036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
8046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (Align > CPSections[SecIdx].Alignment)
8066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      CPSections[SecIdx].Alignment = Align;
8076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    CPSections[SecIdx].CPEs.push_back(i);
8086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
8096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Now print stuff into the calculated sections.
8116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (unsigned i = 0, e = CPSections.size(); i != e; ++i) {
8126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.SwitchSection(CPSections[i].S);
8136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitAlignment(Log2_32(CPSections[i].Alignment));
8146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    unsigned Offset = 0;
8166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) {
8176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      unsigned CPI = CPSections[i].CPEs[j];
8186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MachineConstantPoolEntry CPE = CP[CPI];
8196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // Emit inter-object padding for alignment.
8216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      unsigned AlignMask = CPE.getAlignment() - 1;
8226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      unsigned NewOffset = (Offset + AlignMask) & ~AlignMask;
8236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitFill(NewOffset - Offset, 0/*fillval*/, 0/*addrspace*/);
8246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      const Type *Ty = CPE.getType();
8266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty);
8276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // Emit the label with a comment on it.
8296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (isVerbose()) {
8306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        OutStreamer.GetCommentOS() << "constant pool ";
8316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        WriteTypeSymbolic(OutStreamer.GetCommentOS(), CPE.getType(),
8326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                          MF->getFunction()->getParent());
8336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        OutStreamer.GetCommentOS() << '\n';
8346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      }
8356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitLabel(GetCPISymbol(CPI));
8366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      if (CPE.isMachineConstantPoolEntry())
8386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        EmitMachineConstantPoolValue(CPE.Val.MachineCPVal);
8396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      else
8406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        EmitGlobalConstant(CPE.Val.ConstVal);
8416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
8426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
8436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
8446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitJumpTableInfo - Print assembly representations of the jump tables used
8466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// by the current function to the current output stream.
8476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan///
8486d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitJumpTableInfo() {
8496d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
8506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MJTI == 0) return;
8516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline) return;
8526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
8536d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (JT.empty()) return;
8546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Pick the directive to use to print the jump table entries, and switch to
8566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // the appropriate section.
8576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const Function *F = MF->getFunction();
8586d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  bool JTInDiffSection = false;
8596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (// In PIC mode, we need to emit the jump table to the same section as the
8606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // function body itself, otherwise the label differences won't make sense.
8616d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // FIXME: Need a better predicate for this: what about custom entries?
8626d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 ||
8636d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // We should also do if the section name is NULL or function is declared
8646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // in discardable section
8656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // FIXME: this isn't the right predicate, should be based on the MCSection
8666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // for the function.
8676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      F->isWeakForLinker()) {
8686d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F,Mang,TM));
8696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  } else {
8706d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Otherwise, drop it in the readonly section.
8716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    const MCSection *ReadOnlySection =
8726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly());
8736d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.SwitchSection(ReadOnlySection);
8746d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    JTInDiffSection = true;
8756d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
8766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8776d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  EmitAlignment(Log2_32(MJTI->getEntryAlignment(*TM.getTargetData())));
8786d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
8806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
8816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // If this jump table was deleted, ignore it.
8836d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (JTBBs.empty()) continue;
8846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // For the EK_LabelDifference32 entry, if the target supports .set, emit a
8866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // .set directive for each unique entry.  This reduces the number of
8876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // relocations the assembler will generate for the jump table.
8886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 &&
8896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        MAI->hasSetDirective()) {
8906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      SmallPtrSet<const MachineBasicBlock*, 16> EmittedSets;
8916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      const TargetLowering *TLI = TM.getTargetLowering();
8926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext);
8936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
8946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        const MachineBasicBlock *MBB = JTBBs[ii];
8956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        if (!EmittedSets.insert(MBB)) continue;
8966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
8976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        // .set LJTSet, LBB32-base
8986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        const MCExpr *LHS =
8996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan          MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext);
9006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        OutStreamer.EmitAssignment(GetJTSetSymbol(JTI, MBB->getNumber()),
9016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                MCBinaryExpr::CreateSub(LHS, Base, OutContext));
9026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      }
9036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
9046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // On some targets (e.g. Darwin) we want to emit two consequtive labels
9066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // before each jump table.  The first label is never referenced, but tells
9076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // the assembler and linker the extents of the jump table object.  The
9086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // second label is actually referenced by the code.
9096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0])
9106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // FIXME: This doesn't have to have any specific name, just any randomly
9116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // named and numbered 'l' label would work.  Simplify GetJTISymbol.
9126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitLabel(GetJTISymbol(JTI, true));
9136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitLabel(GetJTISymbol(JTI));
9156d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii)
9176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      EmitJumpTableEntry(MJTI, JTBBs[ii], JTI);
9186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
9196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan}
9206d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9216d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
9226d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// current stream.
9236d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanvoid AsmPrinter::EmitJumpTableEntry(const MachineJumpTableInfo *MJTI,
9246d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                    const MachineBasicBlock *MBB,
9256d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                    unsigned UID) const {
9266d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const MCExpr *Value = 0;
9276d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  switch (MJTI->getEntryKind()) {
9286d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case MachineJumpTableInfo::EK_Inline:
9296d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    llvm_unreachable("Cannot emit EK_Inline jump table entry"); break;
9306d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case MachineJumpTableInfo::EK_Custom32:
9316d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    Value = TM.getTargetLowering()->LowerCustomJumpTableEntry(MJTI, MBB, UID,
9326d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                                              OutContext);
9336d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    break;
9346d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case MachineJumpTableInfo::EK_BlockAddress:
9356d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // EK_BlockAddress - Each entry is a plain address of block, e.g.:
9366d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    //     .word LBB123
9376d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext);
9386d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    break;
9396d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case MachineJumpTableInfo::EK_GPRel32BlockAddress: {
9406d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // EK_GPRel32BlockAddress - Each entry is an address of block, encoded
9416d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // with a relocation as gp-relative, e.g.:
9426d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    //     .gprel32 LBB123
9436d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    MCSymbol *MBBSym = MBB->getSymbol();
9446d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.EmitGPRel32Value(MCSymbolRefExpr::Create(MBBSym, OutContext));
9456d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return;
9466d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
9476d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9486d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  case MachineJumpTableInfo::EK_LabelDifference32: {
9496d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // EK_LabelDifference32 - Each entry is the address of the block minus
9506d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // the address of the jump table.  This is used for PIC jump tables where
9516d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // gprel32 is not supported.  e.g.:
9526d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    //      .word LBB123 - LJTI1_2
9536d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // If the .set directive is supported, this is emitted as:
9546d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    //      .set L4_5_set_123, LBB123 - LJTI1_2
9556d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    //      .word L4_5_set_123
9566d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9576d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // If we have emitted set directives for the jump table entries, print
9586d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // them rather than the entries themselves.  If we're emitting PIC, then
9596d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // emit the table entries as differences between two text section labels.
9606d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (MAI->hasSetDirective()) {
9616d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      // If we used .set, reference the .set's symbol.
9626d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      Value = MCSymbolRefExpr::Create(GetJTSetSymbol(UID, MBB->getNumber()),
9636d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                      OutContext);
9646d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      break;
9656d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
9666d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    // Otherwise, use the difference as the jump table entry.
9676d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    Value = MCSymbolRefExpr::Create(MBB->getSymbol(), OutContext);
9686d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    const MCExpr *JTI = MCSymbolRefExpr::Create(GetJTISymbol(UID), OutContext);
9696d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    Value = MCBinaryExpr::CreateSub(Value, JTI, OutContext);
9706d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    break;
9716d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
9726d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
9736d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9746d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  assert(Value && "Unknown entry kind!");
9756d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9766d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  unsigned EntrySize = MJTI->getEntrySize(*TM.getTargetData());
97745577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev  OutStreamer.EmitValue(Value, EntrySize, /*addrspace*/0);
97845577eac2c9317f5a8adfe7a9d37f62f45832b96vladlosev}
9796d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9806d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9816d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// EmitSpecialLLVMGlobal - Check to see if the specified global is a
9826d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// special global used by LLVM.  If so, emit it and return true, otherwise
9836d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan/// do nothing and return false.
9846d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wanbool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
9856d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (GV->getName() == "llvm.used") {
9866d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (MAI->hasNoDeadStrip())    // No need to emit this at all.
9876d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      EmitLLVMUsedList(GV->getInitializer());
9886d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return true;
9896d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
9906d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9916d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  // Ignore debug and non-emitted data.  This handles llvm.compiler.used.
9926d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (GV->getSection() == "llvm.metadata" ||
9936d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      GV->hasAvailableExternallyLinkage())
9946d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return true;
9956d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9966d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (!GV->hasAppendingLinkage()) return false;
9976d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
9986d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  assert(GV->hasInitializer() && "Not a special LLVM global!");
9996d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
10006d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  const TargetData *TD = TM.getTargetData();
10016d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  unsigned Align = Log2_32(TD->getPointerPrefAlignment());
10026d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (GV->getName() == "llvm.global_ctors") {
10036d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.SwitchSection(getObjFileLowering().getStaticCtorSection());
10046d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitAlignment(Align, 0);
10056d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitXXStructorList(GV->getInitializer());
10066d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan
10076d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    if (TM.getRelocationModel() == Reloc::Static &&
10086d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan        MAI->hasStaticCtorDtorReferenceInStaticMode()) {
10096d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      StringRef Sym(".constructors_used");
10106d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan      OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym),
10116d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan                                      MCSA_Reference);
10126d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    }
10136d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    return true;
10146d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  }
10159644db857432db95bc64f5d6db5867b1c7cf1679zhanyong.wan
10166d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan  if (GV->getName() == "llvm.global_dtors") {
10176d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    OutStreamer.SwitchSection(getObjFileLowering().getStaticDtorSection());
10186d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitAlignment(Align, 0);
10196d63ee6720540cadb8919037c5d41a6413cc9101zhanyong.wan    EmitXXStructorList(GV->getInitializer());
1020c427f5e8ab231012d7663a0ee408f1225bac971azhanyong.wan
1021    if (TM.getRelocationModel() == Reloc::Static &&
1022        MAI->hasStaticCtorDtorReferenceInStaticMode()) {
1023      StringRef Sym(".destructors_used");
1024      OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym),
1025                                      MCSA_Reference);
1026    }
1027    return true;
1028  }
1029
1030  return false;
1031}
1032
1033/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
1034/// global in the specified llvm.used list for which emitUsedDirectiveFor
1035/// is true, as being used with this directive.
1036void AsmPrinter::EmitLLVMUsedList(Constant *List) {
1037  // Should be an array of 'i8*'.
1038  ConstantArray *InitList = dyn_cast<ConstantArray>(List);
1039  if (InitList == 0) return;
1040
1041  for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
1042    const GlobalValue *GV =
1043      dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts());
1044    if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang))
1045      OutStreamer.EmitSymbolAttribute(Mang->getSymbol(GV), MCSA_NoDeadStrip);
1046  }
1047}
1048
1049/// EmitXXStructorList - Emit the ctor or dtor list.  This just prints out the
1050/// function pointers, ignoring the init priority.
1051void AsmPrinter::EmitXXStructorList(Constant *List) {
1052  // Should be an array of '{ int, void ()* }' structs.  The first value is the
1053  // init priority, which we ignore.
1054  if (!isa<ConstantArray>(List)) return;
1055  ConstantArray *InitList = cast<ConstantArray>(List);
1056  for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i)
1057    if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){
1058      if (CS->getNumOperands() != 2) return;  // Not array of 2-element structs.
1059
1060      if (CS->getOperand(1)->isNullValue())
1061        return;  // Found a null terminator, exit printing.
1062      // Emit the function pointer.
1063      EmitGlobalConstant(CS->getOperand(1));
1064    }
1065}
1066
1067//===--------------------------------------------------------------------===//
1068// Emission and print routines
1069//
1070
1071/// EmitInt8 - Emit a byte directive and value.
1072///
1073void AsmPrinter::EmitInt8(int Value) const {
1074  OutStreamer.EmitIntValue(Value, 1, 0/*addrspace*/);
1075}
1076
1077/// EmitInt16 - Emit a short directive and value.
1078///
1079void AsmPrinter::EmitInt16(int Value) const {
1080  OutStreamer.EmitIntValue(Value, 2, 0/*addrspace*/);
1081}
1082
1083/// EmitInt32 - Emit a long directive and value.
1084///
1085void AsmPrinter::EmitInt32(int Value) const {
1086  OutStreamer.EmitIntValue(Value, 4, 0/*addrspace*/);
1087}
1088
1089/// EmitLabelDifference - Emit something like ".long Hi-Lo" where the size
1090/// in bytes of the directive is specified by Size and Hi/Lo specify the
1091/// labels.  This implicitly uses .set if it is available.
1092void AsmPrinter::EmitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
1093                                     unsigned Size) const {
1094  // Get the Hi-Lo expression.
1095  const MCExpr *Diff =
1096    MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(Hi, OutContext),
1097                            MCSymbolRefExpr::Create(Lo, OutContext),
1098                            OutContext);
1099
1100  if (!MAI->hasSetDirective()) {
1101    OutStreamer.EmitValue(Diff, Size, 0/*AddrSpace*/);
1102    return;
1103  }
1104
1105  // Otherwise, emit with .set (aka assignment).
1106  MCSymbol *SetLabel = GetTempSymbol("set", SetCounter++);
1107  OutStreamer.EmitAssignment(SetLabel, Diff);
1108  OutStreamer.EmitSymbolValue(SetLabel, Size, 0/*AddrSpace*/);
1109}
1110
1111/// EmitLabelOffsetDifference - Emit something like ".long Hi+Offset-Lo"
1112/// where the size in bytes of the directive is specified by Size and Hi/Lo
1113/// specify the labels.  This implicitly uses .set if it is available.
1114void AsmPrinter::EmitLabelOffsetDifference(const MCSymbol *Hi, uint64_t Offset,
1115                                           const MCSymbol *Lo, unsigned Size)
1116  const {
1117
1118  // Emit Hi+Offset - Lo
1119  // Get the Hi+Offset expression.
1120  const MCExpr *Plus =
1121    MCBinaryExpr::CreateAdd(MCSymbolRefExpr::Create(Hi, OutContext),
1122                            MCConstantExpr::Create(Offset, OutContext),
1123                            OutContext);
1124
1125  // Get the Hi+Offset-Lo expression.
1126  const MCExpr *Diff =
1127    MCBinaryExpr::CreateSub(Plus,
1128                            MCSymbolRefExpr::Create(Lo, OutContext),
1129                            OutContext);
1130
1131  if (!MAI->hasSetDirective())
1132    OutStreamer.EmitValue(Diff, 4, 0/*AddrSpace*/);
1133  else {
1134    // Otherwise, emit with .set (aka assignment).
1135    MCSymbol *SetLabel = GetTempSymbol("set", SetCounter++);
1136    OutStreamer.EmitAssignment(SetLabel, Diff);
1137    OutStreamer.EmitSymbolValue(SetLabel, 4, 0/*AddrSpace*/);
1138  }
1139}
1140
1141
1142//===----------------------------------------------------------------------===//
1143
1144// EmitAlignment - Emit an alignment directive to the specified power of
1145// two boundary.  For example, if you pass in 3 here, you will get an 8
1146// byte alignment.  If a global value is specified, and if that global has
1147// an explicit alignment requested, it will unconditionally override the
1148// alignment request.  However, if ForcedAlignBits is specified, this value
1149// has final say: the ultimate alignment will be the max of ForcedAlignBits
1150// and the alignment computed with NumBits and the global.
1151//
1152// The algorithm is:
1153//     Align = NumBits;
1154//     if (GV && GV->hasalignment) Align = GV->getalignment();
1155//     Align = std::max(Align, ForcedAlignBits);
1156//
1157void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
1158                               unsigned ForcedAlignBits,
1159                               bool UseFillExpr) const {
1160  if (GV && GV->getAlignment())
1161    NumBits = Log2_32(GV->getAlignment());
1162  NumBits = std::max(NumBits, ForcedAlignBits);
1163
1164  if (NumBits == 0) return;   // No need to emit alignment.
1165
1166  if (getCurrentSection()->getKind().isText())
1167    OutStreamer.EmitCodeAlignment(1 << NumBits);
1168  else
1169    OutStreamer.EmitValueToAlignment(1 << NumBits, 0, 1, 0);
1170}
1171
1172//===----------------------------------------------------------------------===//
1173// Constant emission.
1174//===----------------------------------------------------------------------===//
1175
1176/// LowerConstant - Lower the specified LLVM Constant to an MCExpr.
1177///
1178static const MCExpr *LowerConstant(const Constant *CV, AsmPrinter &AP) {
1179  MCContext &Ctx = AP.OutContext;
1180
1181  if (CV->isNullValue() || isa<UndefValue>(CV))
1182    return MCConstantExpr::Create(0, Ctx);
1183
1184  if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV))
1185    return MCConstantExpr::Create(CI->getZExtValue(), Ctx);
1186
1187  if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
1188    return MCSymbolRefExpr::Create(AP.Mang->getSymbol(GV), Ctx);
1189  if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV))
1190    return MCSymbolRefExpr::Create(AP.GetBlockAddressSymbol(BA), Ctx);
1191
1192  const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
1193  if (CE == 0) {
1194    llvm_unreachable("Unknown constant value to lower!");
1195    return MCConstantExpr::Create(0, Ctx);
1196  }
1197
1198  switch (CE->getOpcode()) {
1199  default:
1200    // If the code isn't optimized, there may be outstanding folding
1201    // opportunities. Attempt to fold the expression using TargetData as a
1202    // last resort before giving up.
1203    if (Constant *C =
1204          ConstantFoldConstantExpression(CE, AP.TM.getTargetData()))
1205      if (C != CE)
1206        return LowerConstant(C, AP);
1207#ifndef NDEBUG
1208    CE->dump();
1209#endif
1210    llvm_unreachable("FIXME: Don't support this constant expr");
1211  case Instruction::GetElementPtr: {
1212    const TargetData &TD = *AP.TM.getTargetData();
1213    // Generate a symbolic expression for the byte address
1214    const Constant *PtrVal = CE->getOperand(0);
1215    SmallVector<Value*, 8> IdxVec(CE->op_begin()+1, CE->op_end());
1216    int64_t Offset = TD.getIndexedOffset(PtrVal->getType(), &IdxVec[0],
1217                                         IdxVec.size());
1218
1219    const MCExpr *Base = LowerConstant(CE->getOperand(0), AP);
1220    if (Offset == 0)
1221      return Base;
1222
1223    // Truncate/sext the offset to the pointer size.
1224    if (TD.getPointerSizeInBits() != 64) {
1225      int SExtAmount = 64-TD.getPointerSizeInBits();
1226      Offset = (Offset << SExtAmount) >> SExtAmount;
1227    }
1228
1229    return MCBinaryExpr::CreateAdd(Base, MCConstantExpr::Create(Offset, Ctx),
1230                                   Ctx);
1231  }
1232
1233  case Instruction::Trunc:
1234    // We emit the value and depend on the assembler to truncate the generated
1235    // expression properly.  This is important for differences between
1236    // blockaddress labels.  Since the two labels are in the same function, it
1237    // is reasonable to treat their delta as a 32-bit value.
1238    // FALL THROUGH.
1239  case Instruction::BitCast:
1240    return LowerConstant(CE->getOperand(0), AP);
1241
1242  case Instruction::IntToPtr: {
1243    const TargetData &TD = *AP.TM.getTargetData();
1244    // Handle casts to pointers by changing them into casts to the appropriate
1245    // integer type.  This promotes constant folding and simplifies this code.
1246    Constant *Op = CE->getOperand(0);
1247    Op = ConstantExpr::getIntegerCast(Op, TD.getIntPtrType(CV->getContext()),
1248                                      false/*ZExt*/);
1249    return LowerConstant(Op, AP);
1250  }
1251
1252  case Instruction::PtrToInt: {
1253    const TargetData &TD = *AP.TM.getTargetData();
1254    // Support only foldable casts to/from pointers that can be eliminated by
1255    // changing the pointer to the appropriately sized integer type.
1256    Constant *Op = CE->getOperand(0);
1257    const Type *Ty = CE->getType();
1258
1259    const MCExpr *OpExpr = LowerConstant(Op, AP);
1260
1261    // We can emit the pointer value into this slot if the slot is an
1262    // integer slot equal to the size of the pointer.
1263    if (TD.getTypeAllocSize(Ty) == TD.getTypeAllocSize(Op->getType()))
1264      return OpExpr;
1265
1266    // Otherwise the pointer is smaller than the resultant integer, mask off
1267    // the high bits so we are sure to get a proper truncation if the input is
1268    // a constant expr.
1269    unsigned InBits = TD.getTypeAllocSizeInBits(Op->getType());
1270    const MCExpr *MaskExpr = MCConstantExpr::Create(~0ULL >> (64-InBits), Ctx);
1271    return MCBinaryExpr::CreateAnd(OpExpr, MaskExpr, Ctx);
1272  }
1273
1274  // The MC library also has a right-shift operator, but it isn't consistently
1275  // signed or unsigned between different targets.
1276  case Instruction::Add:
1277  case Instruction::Sub:
1278  case Instruction::Mul:
1279  case Instruction::SDiv:
1280  case Instruction::SRem:
1281  case Instruction::Shl:
1282  case Instruction::And:
1283  case Instruction::Or:
1284  case Instruction::Xor: {
1285    const MCExpr *LHS = LowerConstant(CE->getOperand(0), AP);
1286    const MCExpr *RHS = LowerConstant(CE->getOperand(1), AP);
1287    switch (CE->getOpcode()) {
1288    default: llvm_unreachable("Unknown binary operator constant cast expr");
1289    case Instruction::Add: return MCBinaryExpr::CreateAdd(LHS, RHS, Ctx);
1290    case Instruction::Sub: return MCBinaryExpr::CreateSub(LHS, RHS, Ctx);
1291    case Instruction::Mul: return MCBinaryExpr::CreateMul(LHS, RHS, Ctx);
1292    case Instruction::SDiv: return MCBinaryExpr::CreateDiv(LHS, RHS, Ctx);
1293    case Instruction::SRem: return MCBinaryExpr::CreateMod(LHS, RHS, Ctx);
1294    case Instruction::Shl: return MCBinaryExpr::CreateShl(LHS, RHS, Ctx);
1295    case Instruction::And: return MCBinaryExpr::CreateAnd(LHS, RHS, Ctx);
1296    case Instruction::Or:  return MCBinaryExpr::CreateOr (LHS, RHS, Ctx);
1297    case Instruction::Xor: return MCBinaryExpr::CreateXor(LHS, RHS, Ctx);
1298    }
1299  }
1300  }
1301}
1302
1303static void EmitGlobalConstantImpl(const Constant *C, unsigned AddrSpace,
1304                                   AsmPrinter &AP);
1305
1306static void EmitGlobalConstantArray(const ConstantArray *CA, unsigned AddrSpace,
1307                                    AsmPrinter &AP) {
1308  if (AddrSpace != 0 || !CA->isString()) {
1309    // Not a string.  Print the values in successive locations
1310    for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i)
1311      EmitGlobalConstantImpl(CA->getOperand(i), AddrSpace, AP);
1312    return;
1313  }
1314
1315  // Otherwise, it can be emitted as .ascii.
1316  SmallVector<char, 128> TmpVec;
1317  TmpVec.reserve(CA->getNumOperands());
1318  for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i)
1319    TmpVec.push_back(cast<ConstantInt>(CA->getOperand(i))->getZExtValue());
1320
1321  AP.OutStreamer.EmitBytes(StringRef(TmpVec.data(), TmpVec.size()), AddrSpace);
1322}
1323
1324static void EmitGlobalConstantVector(const ConstantVector *CV,
1325                                     unsigned AddrSpace, AsmPrinter &AP) {
1326  for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i)
1327    EmitGlobalConstantImpl(CV->getOperand(i), AddrSpace, AP);
1328}
1329
1330static void EmitGlobalConstantStruct(const ConstantStruct *CS,
1331                                     unsigned AddrSpace, AsmPrinter &AP) {
1332  // Print the fields in successive locations. Pad to align if needed!
1333  const TargetData *TD = AP.TM.getTargetData();
1334  unsigned Size = TD->getTypeAllocSize(CS->getType());
1335  const StructLayout *Layout = TD->getStructLayout(CS->getType());
1336  uint64_t SizeSoFar = 0;
1337  for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i) {
1338    const Constant *Field = CS->getOperand(i);
1339
1340    // Check if padding is needed and insert one or more 0s.
1341    uint64_t FieldSize = TD->getTypeAllocSize(Field->getType());
1342    uint64_t PadSize = ((i == e-1 ? Size : Layout->getElementOffset(i+1))
1343                        - Layout->getElementOffset(i)) - FieldSize;
1344    SizeSoFar += FieldSize + PadSize;
1345
1346    // Now print the actual field value.
1347    EmitGlobalConstantImpl(Field, AddrSpace, AP);
1348
1349    // Insert padding - this may include padding to increase the size of the
1350    // current field up to the ABI size (if the struct is not packed) as well
1351    // as padding to ensure that the next field starts at the right offset.
1352    AP.OutStreamer.EmitZeros(PadSize, AddrSpace);
1353  }
1354  assert(SizeSoFar == Layout->getSizeInBytes() &&
1355         "Layout of constant struct may be incorrect!");
1356}
1357
1358static void EmitGlobalConstantUnion(const ConstantUnion *CU,
1359                                    unsigned AddrSpace, AsmPrinter &AP) {
1360  const TargetData *TD = AP.TM.getTargetData();
1361  unsigned Size = TD->getTypeAllocSize(CU->getType());
1362
1363  const Constant *Contents = CU->getOperand(0);
1364  unsigned FilledSize = TD->getTypeAllocSize(Contents->getType());
1365
1366  // Print the actually filled part
1367  EmitGlobalConstantImpl(Contents, AddrSpace, AP);
1368
1369  // And pad with enough zeroes
1370  AP.OutStreamer.EmitZeros(Size-FilledSize, AddrSpace);
1371}
1372
1373static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace,
1374                                 AsmPrinter &AP) {
1375  // FP Constants are printed as integer constants to avoid losing
1376  // precision.
1377  if (CFP->getType()->isDoubleTy()) {
1378    if (AP.isVerbose()) {
1379      double Val = CFP->getValueAPF().convertToDouble();
1380      AP.OutStreamer.GetCommentOS() << "double " << Val << '\n';
1381    }
1382
1383    uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
1384    AP.OutStreamer.EmitIntValue(Val, 8, AddrSpace);
1385    return;
1386  }
1387
1388  if (CFP->getType()->isFloatTy()) {
1389    if (AP.isVerbose()) {
1390      float Val = CFP->getValueAPF().convertToFloat();
1391      AP.OutStreamer.GetCommentOS() << "float " << Val << '\n';
1392    }
1393    uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
1394    AP.OutStreamer.EmitIntValue(Val, 4, AddrSpace);
1395    return;
1396  }
1397
1398  if (CFP->getType()->isX86_FP80Ty()) {
1399    // all long double variants are printed as hex
1400    // API needed to prevent premature destruction
1401    APInt API = CFP->getValueAPF().bitcastToAPInt();
1402    const uint64_t *p = API.getRawData();
1403    if (AP.isVerbose()) {
1404      // Convert to double so we can print the approximate val as a comment.
1405      APFloat DoubleVal = CFP->getValueAPF();
1406      bool ignored;
1407      DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven,
1408                        &ignored);
1409      AP.OutStreamer.GetCommentOS() << "x86_fp80 ~= "
1410        << DoubleVal.convertToDouble() << '\n';
1411    }
1412
1413    if (AP.TM.getTargetData()->isBigEndian()) {
1414      AP.OutStreamer.EmitIntValue(p[1], 2, AddrSpace);
1415      AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
1416    } else {
1417      AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
1418      AP.OutStreamer.EmitIntValue(p[1], 2, AddrSpace);
1419    }
1420
1421    // Emit the tail padding for the long double.
1422    const TargetData &TD = *AP.TM.getTargetData();
1423    AP.OutStreamer.EmitZeros(TD.getTypeAllocSize(CFP->getType()) -
1424                             TD.getTypeStoreSize(CFP->getType()), AddrSpace);
1425    return;
1426  }
1427
1428  assert(CFP->getType()->isPPC_FP128Ty() &&
1429         "Floating point constant type not handled");
1430  // All long double variants are printed as hex
1431  // API needed to prevent premature destruction.
1432  APInt API = CFP->getValueAPF().bitcastToAPInt();
1433  const uint64_t *p = API.getRawData();
1434  if (AP.TM.getTargetData()->isBigEndian()) {
1435    AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
1436    AP.OutStreamer.EmitIntValue(p[1], 8, AddrSpace);
1437  } else {
1438    AP.OutStreamer.EmitIntValue(p[1], 8, AddrSpace);
1439    AP.OutStreamer.EmitIntValue(p[0], 8, AddrSpace);
1440  }
1441}
1442
1443static void EmitGlobalConstantLargeInt(const ConstantInt *CI,
1444                                       unsigned AddrSpace, AsmPrinter &AP) {
1445  const TargetData *TD = AP.TM.getTargetData();
1446  unsigned BitWidth = CI->getBitWidth();
1447  assert((BitWidth & 63) == 0 && "only support multiples of 64-bits");
1448
1449  // We don't expect assemblers to support integer data directives
1450  // for more than 64 bits, so we emit the data in at most 64-bit
1451  // quantities at a time.
1452  const uint64_t *RawData = CI->getValue().getRawData();
1453  for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
1454    uint64_t Val = TD->isBigEndian() ? RawData[e - i - 1] : RawData[i];
1455    AP.OutStreamer.EmitIntValue(Val, 8, AddrSpace);
1456  }
1457}
1458
1459static void EmitGlobalConstantImpl(const Constant *CV, unsigned AddrSpace,
1460                                   AsmPrinter &AP) {
1461  if (isa<ConstantAggregateZero>(CV) || isa<UndefValue>(CV)) {
1462    uint64_t Size = AP.TM.getTargetData()->getTypeAllocSize(CV->getType());
1463    return AP.OutStreamer.EmitZeros(Size, AddrSpace);
1464  }
1465
1466  if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
1467    unsigned Size = AP.TM.getTargetData()->getTypeAllocSize(CV->getType());
1468    switch (Size) {
1469    case 1:
1470    case 2:
1471    case 4:
1472    case 8:
1473      if (AP.isVerbose())
1474        AP.OutStreamer.GetCommentOS() << format("0x%llx\n", CI->getZExtValue());
1475        AP.OutStreamer.EmitIntValue(CI->getZExtValue(), Size, AddrSpace);
1476      return;
1477    default:
1478      EmitGlobalConstantLargeInt(CI, AddrSpace, AP);
1479      return;
1480    }
1481  }
1482
1483  if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV))
1484    return EmitGlobalConstantArray(CVA, AddrSpace, AP);
1485
1486  if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV))
1487    return EmitGlobalConstantStruct(CVS, AddrSpace, AP);
1488
1489  if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV))
1490    return EmitGlobalConstantFP(CFP, AddrSpace, AP);
1491
1492  if (isa<ConstantPointerNull>(CV)) {
1493    unsigned Size = AP.TM.getTargetData()->getTypeAllocSize(CV->getType());
1494    AP.OutStreamer.EmitIntValue(0, Size, AddrSpace);
1495    return;
1496  }
1497
1498  if (const ConstantUnion *CVU = dyn_cast<ConstantUnion>(CV))
1499    return EmitGlobalConstantUnion(CVU, AddrSpace, AP);
1500
1501  if (const ConstantVector *V = dyn_cast<ConstantVector>(CV))
1502    return EmitGlobalConstantVector(V, AddrSpace, AP);
1503
1504  // Otherwise, it must be a ConstantExpr.  Lower it to an MCExpr, then emit it
1505  // thread the streamer with EmitValue.
1506  AP.OutStreamer.EmitValue(LowerConstant(CV, AP),
1507                         AP.TM.getTargetData()->getTypeAllocSize(CV->getType()),
1508                           AddrSpace);
1509}
1510
1511/// EmitGlobalConstant - Print a general LLVM constant to the .s file.
1512void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) {
1513  uint64_t Size = TM.getTargetData()->getTypeAllocSize(CV->getType());
1514  if (Size)
1515    EmitGlobalConstantImpl(CV, AddrSpace, *this);
1516  else if (MAI->hasSubsectionsViaSymbols()) {
1517    // If the global has zero size, emit a single byte so that two labels don't
1518    // look like they are at the same location.
1519    OutStreamer.EmitIntValue(0, 1, AddrSpace);
1520  }
1521}
1522
1523void AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
1524  // Target doesn't support this yet!
1525  llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
1526}
1527
1528void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const {
1529  if (Offset > 0)
1530    OS << '+' << Offset;
1531  else if (Offset < 0)
1532    OS << Offset;
1533}
1534
1535//===----------------------------------------------------------------------===//
1536// Symbol Lowering Routines.
1537//===----------------------------------------------------------------------===//
1538
1539/// GetTempSymbol - Return the MCSymbol corresponding to the assembler
1540/// temporary label with the specified stem and unique ID.
1541MCSymbol *AsmPrinter::GetTempSymbol(StringRef Name, unsigned ID) const {
1542  return OutContext.GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix()) +
1543                                      Name + Twine(ID));
1544}
1545
1546/// GetTempSymbol - Return an assembler temporary label with the specified
1547/// stem.
1548MCSymbol *AsmPrinter::GetTempSymbol(StringRef Name) const {
1549  return OutContext.GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix())+
1550                                      Name);
1551}
1552
1553
1554MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const {
1555  return MMI->getAddrLabelSymbol(BA->getBasicBlock());
1556}
1557
1558MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const {
1559  return MMI->getAddrLabelSymbol(BB);
1560}
1561
1562/// GetCPISymbol - Return the symbol for the specified constant pool entry.
1563MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const {
1564  return OutContext.GetOrCreateSymbol
1565    (Twine(MAI->getPrivateGlobalPrefix()) + "CPI" + Twine(getFunctionNumber())
1566     + "_" + Twine(CPID));
1567}
1568
1569/// GetJTISymbol - Return the symbol for the specified jump table entry.
1570MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const {
1571  return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate);
1572}
1573
1574/// GetJTSetSymbol - Return the symbol for the specified jump table .set
1575/// FIXME: privatize to AsmPrinter.
1576MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const {
1577  return OutContext.GetOrCreateSymbol
1578  (Twine(MAI->getPrivateGlobalPrefix()) + Twine(getFunctionNumber()) + "_" +
1579   Twine(UID) + "_set_" + Twine(MBBID));
1580}
1581
1582/// GetSymbolWithGlobalValueBase - Return the MCSymbol for a symbol with
1583/// global value name as its base, with the specified suffix, and where the
1584/// symbol is forced to have private linkage if ForcePrivate is true.
1585MCSymbol *AsmPrinter::GetSymbolWithGlobalValueBase(const GlobalValue *GV,
1586                                                   StringRef Suffix,
1587                                                   bool ForcePrivate) const {
1588  SmallString<60> NameStr;
1589  Mang->getNameWithPrefix(NameStr, GV, ForcePrivate);
1590  NameStr.append(Suffix.begin(), Suffix.end());
1591  return OutContext.GetOrCreateSymbol(NameStr.str());
1592}
1593
1594/// GetExternalSymbolSymbol - Return the MCSymbol for the specified
1595/// ExternalSymbol.
1596MCSymbol *AsmPrinter::GetExternalSymbolSymbol(StringRef Sym) const {
1597  SmallString<60> NameStr;
1598  Mang->getNameWithPrefix(NameStr, Sym);
1599  return OutContext.GetOrCreateSymbol(NameStr.str());
1600}
1601
1602
1603
1604/// PrintParentLoopComment - Print comments about parent loops of this one.
1605static void PrintParentLoopComment(raw_ostream &OS, const MachineLoop *Loop,
1606                                   unsigned FunctionNumber) {
1607  if (Loop == 0) return;
1608  PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber);
1609  OS.indent(Loop->getLoopDepth()*2)
1610    << "Parent Loop BB" << FunctionNumber << "_"
1611    << Loop->getHeader()->getNumber()
1612    << " Depth=" << Loop->getLoopDepth() << '\n';
1613}
1614
1615
1616/// PrintChildLoopComment - Print comments about child loops within
1617/// the loop for this basic block, with nesting.
1618static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop,
1619                                  unsigned FunctionNumber) {
1620  // Add child loop information
1621  for (MachineLoop::iterator CL = Loop->begin(), E = Loop->end();CL != E; ++CL){
1622    OS.indent((*CL)->getLoopDepth()*2)
1623      << "Child Loop BB" << FunctionNumber << "_"
1624      << (*CL)->getHeader()->getNumber() << " Depth " << (*CL)->getLoopDepth()
1625      << '\n';
1626    PrintChildLoopComment(OS, *CL, FunctionNumber);
1627  }
1628}
1629
1630/// EmitBasicBlockLoopComments - Pretty-print comments for basic blocks.
1631static void EmitBasicBlockLoopComments(const MachineBasicBlock &MBB,
1632                                       const MachineLoopInfo *LI,
1633                                       const AsmPrinter &AP) {
1634  // Add loop depth information
1635  const MachineLoop *Loop = LI->getLoopFor(&MBB);
1636  if (Loop == 0) return;
1637
1638  MachineBasicBlock *Header = Loop->getHeader();
1639  assert(Header && "No header for loop");
1640
1641  // If this block is not a loop header, just print out what is the loop header
1642  // and return.
1643  if (Header != &MBB) {
1644    AP.OutStreamer.AddComment("  in Loop: Header=BB" +
1645                              Twine(AP.getFunctionNumber())+"_" +
1646                              Twine(Loop->getHeader()->getNumber())+
1647                              " Depth="+Twine(Loop->getLoopDepth()));
1648    return;
1649  }
1650
1651  // Otherwise, it is a loop header.  Print out information about child and
1652  // parent loops.
1653  raw_ostream &OS = AP.OutStreamer.GetCommentOS();
1654
1655  PrintParentLoopComment(OS, Loop->getParentLoop(), AP.getFunctionNumber());
1656
1657  OS << "=>";
1658  OS.indent(Loop->getLoopDepth()*2-2);
1659
1660  OS << "This ";
1661  if (Loop->empty())
1662    OS << "Inner ";
1663  OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n';
1664
1665  PrintChildLoopComment(OS, Loop, AP.getFunctionNumber());
1666}
1667
1668
1669/// EmitBasicBlockStart - This method prints the label for the specified
1670/// MachineBasicBlock, an alignment (if present) and a comment describing
1671/// it if appropriate.
1672void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const {
1673  // Emit an alignment directive for this block, if needed.
1674  if (unsigned Align = MBB->getAlignment())
1675    EmitAlignment(Log2_32(Align));
1676
1677  // If the block has its address taken, emit any labels that were used to
1678  // reference the block.  It is possible that there is more than one label
1679  // here, because multiple LLVM BB's may have been RAUW'd to this block after
1680  // the references were generated.
1681  if (MBB->hasAddressTaken()) {
1682    const BasicBlock *BB = MBB->getBasicBlock();
1683    if (isVerbose())
1684      OutStreamer.AddComment("Block address taken");
1685
1686    std::vector<MCSymbol*> Syms = MMI->getAddrLabelSymbolToEmit(BB);
1687
1688    for (unsigned i = 0, e = Syms.size(); i != e; ++i)
1689      OutStreamer.EmitLabel(Syms[i]);
1690  }
1691
1692  // Print the main label for the block.
1693  if (MBB->pred_empty() || isBlockOnlyReachableByFallthrough(MBB)) {
1694    if (isVerbose() && OutStreamer.hasRawTextSupport()) {
1695      if (const BasicBlock *BB = MBB->getBasicBlock())
1696        if (BB->hasName())
1697          OutStreamer.AddComment("%" + BB->getName());
1698
1699      EmitBasicBlockLoopComments(*MBB, LI, *this);
1700
1701      // NOTE: Want this comment at start of line, don't emit with AddComment.
1702      OutStreamer.EmitRawText(Twine(MAI->getCommentString()) + " BB#" +
1703                              Twine(MBB->getNumber()) + ":");
1704    }
1705  } else {
1706    if (isVerbose()) {
1707      if (const BasicBlock *BB = MBB->getBasicBlock())
1708        if (BB->hasName())
1709          OutStreamer.AddComment("%" + BB->getName());
1710      EmitBasicBlockLoopComments(*MBB, LI, *this);
1711    }
1712
1713    OutStreamer.EmitLabel(MBB->getSymbol());
1714  }
1715}
1716
1717void AsmPrinter::EmitVisibility(MCSymbol *Sym, unsigned Visibility) const {
1718  MCSymbolAttr Attr = MCSA_Invalid;
1719
1720  switch (Visibility) {
1721  default: break;
1722  case GlobalValue::HiddenVisibility:
1723    Attr = MAI->getHiddenVisibilityAttr();
1724    break;
1725  case GlobalValue::ProtectedVisibility:
1726    Attr = MAI->getProtectedVisibilityAttr();
1727    break;
1728  }
1729
1730  if (Attr != MCSA_Invalid)
1731    OutStreamer.EmitSymbolAttribute(Sym, Attr);
1732}
1733
1734/// isBlockOnlyReachableByFallthough - Return true if the basic block has
1735/// exactly one predecessor and the control transfer mechanism between
1736/// the predecessor and this block is a fall-through.
1737bool AsmPrinter::
1738isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const {
1739  // If this is a landing pad, it isn't a fall through.  If it has no preds,
1740  // then nothing falls through to it.
1741  if (MBB->isLandingPad() || MBB->pred_empty())
1742    return false;
1743
1744  // If there isn't exactly one predecessor, it can't be a fall through.
1745  MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI;
1746  ++PI2;
1747  if (PI2 != MBB->pred_end())
1748    return false;
1749
1750  // The predecessor has to be immediately before this block.
1751  const MachineBasicBlock *Pred = *PI;
1752
1753  if (!Pred->isLayoutSuccessor(MBB))
1754    return false;
1755
1756  // If the block is completely empty, then it definitely does fall through.
1757  if (Pred->empty())
1758    return true;
1759
1760  // Otherwise, check the last instruction.
1761  const MachineInstr &LastInst = Pred->back();
1762  return !LastInst.getDesc().isBarrier();
1763}
1764
1765
1766
1767GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) {
1768  if (!S->usesMetadata())
1769    return 0;
1770
1771  gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
1772  gcp_map_type::iterator GCPI = GCMap.find(S);
1773  if (GCPI != GCMap.end())
1774    return GCPI->second;
1775
1776  const char *Name = S->getName().c_str();
1777
1778  for (GCMetadataPrinterRegistry::iterator
1779         I = GCMetadataPrinterRegistry::begin(),
1780         E = GCMetadataPrinterRegistry::end(); I != E; ++I)
1781    if (strcmp(Name, I->getName()) == 0) {
1782      GCMetadataPrinter *GMP = I->instantiate();
1783      GMP->S = S;
1784      GCMap.insert(std::make_pair(S, GMP));
1785      return GMP;
1786    }
1787
1788  report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
1789  return 0;
1790}
1791
1792