10dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner//===-- X86AsmPrinter.cpp - Convert X86 LLVM code to AT&T assembly --------===// 20e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 70e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner// 100dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner// This file contains a printer that converts from our internal representation 1114c38ec2afeaf25c53a50c2c65116aca8c889401Chris Lattner// of machine-dependent LLVM code to X86 machine code. 12726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner// 13726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner//===----------------------------------------------------------------------===// 14726140821f96e3472a8eccef0c67c0b5ad65a1d9Chris Lattner 150dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "X86AsmPrinter.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "InstPrinter/X86ATTInstPrinter.h" 170dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "X86.h" 180dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "X86COFFMachineModuleInfo.h" 190dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "X86MachineFunctionInfo.h" 200dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "X86TargetMachine.h" 21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/SmallString.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Assembly/Writer.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineJumpTableInfo.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineModuleInfoImpls.h" 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 260bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h" 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h" 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h" 290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 300b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 31becd83e3f4eb996f8e43189ce482267b3b8351a8Bill Wendling#include "llvm/MC/MCAsmInfo.h" 320dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "llvm/MC/MCContext.h" 33beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner#include "llvm/MC/MCExpr.h" 340dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "llvm/MC/MCSectionMachO.h" 350dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "llvm/MC/MCStreamer.h" 360dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "llvm/MC/MCSymbol.h" 379fe2c6704582a6730f4fc99dd85e214b23f3494bChris Lattner#include "llvm/Support/COFF.h" 385c1d941f00a3cdb4bdcefa95b4ff34ae8922cf15Devang Patel#include "llvm/Support/Debug.h" 390dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner#include "llvm/Support/ErrorHandling.h" 403e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 41d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/Mangler.h" 42d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetOptions.h" 430dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnerusing namespace llvm; 440dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 450dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner//===----------------------------------------------------------------------===// 460dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner// Primitive Helper Functions. 470dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner//===----------------------------------------------------------------------===// 480dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4914c38ec2afeaf25c53a50c2c65116aca8c889401Chris Lattner/// runOnMachineFunction - Emit the function body. 500dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// 510dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnerbool X86AsmPrinter::runOnMachineFunction(MachineFunction &MF) { 520dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner SetupMachineFunction(MF); 530dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 542bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng if (Subtarget->isTargetCOFF() && !Subtarget->isTargetEnvMacho()) { 55b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner bool Intrn = MF.getFunction()->hasInternalLinkage(); 56b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OutStreamer.BeginCOFFSymbolDef(CurrentFnSym); 5722854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach OutStreamer.EmitCOFFSymbolStorageClass(Intrn ? COFF::IMAGE_SYM_CLASS_STATIC 589fe2c6704582a6730f4fc99dd85e214b23f3494bChris Lattner : COFF::IMAGE_SYM_CLASS_EXTERNAL); 599fe2c6704582a6730f4fc99dd85e214b23f3494bChris Lattner OutStreamer.EmitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_FUNCTION 609fe2c6704582a6730f4fc99dd85e214b23f3494bChris Lattner << COFF::SCT_COMPLEX_TYPE_SHIFT); 61b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OutStreamer.EndCOFFSymbolDef(); 62b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner } 634dd162f3945636cbe6123682619e994f75a62d00Anton Korobeynikov 64b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner // Have common code print out the function header with linkage info etc. 65b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner EmitFunctionHeader(); 664dd162f3945636cbe6123682619e994f75a62d00Anton Korobeynikov 6714c38ec2afeaf25c53a50c2c65116aca8c889401Chris Lattner // Emit the rest of the function body. 6814c38ec2afeaf25c53a50c2c65116aca8c889401Chris Lattner EmitFunctionBody(); 690dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 700dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // We didn't modify anything. 710dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 720dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 730dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 740dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// printSymbolOperand - Print a raw symbol reference operand. This handles 750dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// jump tables, constant pools, global address and external symbols, all of 760dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// which print to a label with various suffixes for relocation types etc. 7788db786712bd1e7b1dd829e02ef960f0828a8becChris Lattnervoid X86AsmPrinter::printSymbolOperand(const MachineOperand &MO, 7888db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner raw_ostream &O) { 790dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner switch (MO.getType()) { 800dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner default: llvm_unreachable("unknown symbol type!"); 810dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_JumpTableIndex: 8264c2b244982046373c853e988b7395fdf0166cd8Chris Lattner O << *GetJTISymbol(MO.getIndex()); 830dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 840dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_ConstantPoolIndex: 8564c2b244982046373c853e988b7395fdf0166cd8Chris Lattner O << *GetCPISymbol(MO.getIndex()); 860c08d092049c025c9ccf7143e39f39dc4e30d6b4Chris Lattner printOffset(MO.getOffset(), O); 870dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 880dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_GlobalAddress: { 890dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const GlobalValue *GV = MO.getGlobal(); 9022854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 915957c84e09b177aecf8b430c33fd75a36575fb57Chris Lattner MCSymbol *GVSym; 920dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) 937a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner GVSym = GetSymbolWithGlobalValueBase(GV, "$stub"); 940dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner else if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || 950dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE || 960dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE) 977a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner GVSym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); 984fb69f40bee04a415a92bca2a8ed4a8e72cf980dChris Lattner else 99deb0cba1bad5a46bbecb75666e415c3dee9c89ebChris Lattner GVSym = Mang->getSymbol(GV); 1004fb69f40bee04a415a92bca2a8ed4a8e72cf980dChris Lattner 1010dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // Handle dllimport linkage. 1020dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.getTargetFlags() == X86II::MO_DLLIMPORT) 1034fb69f40bee04a415a92bca2a8ed4a8e72cf980dChris Lattner GVSym = OutContext.GetOrCreateSymbol(Twine("__imp_") + GVSym->getName()); 10422854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 1050dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY || 1060dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MO.getTargetFlags() == X86II::MO_DARWIN_NONLAZY_PIC_BASE) { 1077a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); 10822854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach MachineModuleInfoImpl::StubValueTy &StubSym = 1090dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MMI->getObjFileInfo<MachineModuleInfoMachO>().getGVStubEntry(Sym); 110cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) 111cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling StubSym = MachineModuleInfoImpl:: 112deb0cba1bad5a46bbecb75666e415c3dee9c89ebChris Lattner StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); 1130dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } else if (MO.getTargetFlags() == X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE){ 1147a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$non_lazy_ptr"); 115cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling MachineModuleInfoImpl::StubValueTy &StubSym = 1160dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MMI->getObjFileInfo<MachineModuleInfoMachO>().getHiddenGVStubEntry(Sym); 117cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) 118cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling StubSym = MachineModuleInfoImpl:: 119deb0cba1bad5a46bbecb75666e415c3dee9c89ebChris Lattner StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); 1200dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } else if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) { 1217a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner MCSymbol *Sym = GetSymbolWithGlobalValueBase(GV, "$stub"); 122cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling MachineModuleInfoImpl::StubValueTy &StubSym = 1230dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MMI->getObjFileInfo<MachineModuleInfoMachO>().getFnStubEntry(Sym); 124cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) 125cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling StubSym = MachineModuleInfoImpl:: 126deb0cba1bad5a46bbecb75666e415c3dee9c89ebChris Lattner StubValueTy(Mang->getSymbol(GV), !GV->hasInternalLinkage()); 1270dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 12822854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 1290dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // If the name begins with a dollar-sign, enclose it in parens. We do this 1300dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // to avoid having it look like an integer immediate to the assembler. 1314fb69f40bee04a415a92bca2a8ed4a8e72cf980dChris Lattner if (GVSym->getName()[0] != '$') 13210b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner O << *GVSym; 13310b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner else 13410b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner O << '(' << *GVSym << ')'; 1350c08d092049c025c9ccf7143e39f39dc4e30d6b4Chris Lattner printOffset(MO.getOffset(), O); 1360dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 1370dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 1380dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_ExternalSymbol: { 139ee9250bb4f88364511cfda9ae95ad787bff1a72cChris Lattner const MCSymbol *SymToPrint; 1400dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.getTargetFlags() == X86II::MO_DARWIN_STUB) { 1418570f594adc8e0795d0c5fd3e531790f6fac1821Chris Lattner SmallString<128> TempNameStr; 1428570f594adc8e0795d0c5fd3e531790f6fac1821Chris Lattner TempNameStr += StringRef(MO.getSymbolName()); 1438570f594adc8e0795d0c5fd3e531790f6fac1821Chris Lattner TempNameStr += StringRef("$stub"); 14422854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 145d269a6e460a71a6c5c361a26c56c91fdb9486f45Chris Lattner MCSymbol *Sym = GetExternalSymbolSymbol(TempNameStr.str()); 146cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling MachineModuleInfoImpl::StubValueTy &StubSym = 1470dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MMI->getObjFileInfo<MachineModuleInfoMachO>().getFnStubEntry(Sym); 148cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling if (StubSym.getPointer() == 0) { 1494813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner TempNameStr.erase(TempNameStr.end()-5, TempNameStr.end()); 150cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling StubSym = MachineModuleInfoImpl:: 151cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling StubValueTy(OutContext.GetOrCreateSymbol(TempNameStr.str()), 152cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling true); 1530dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 154cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling SymToPrint = StubSym.getPointer(); 155ee9250bb4f88364511cfda9ae95ad787bff1a72cChris Lattner } else { 1568570f594adc8e0795d0c5fd3e531790f6fac1821Chris Lattner SymToPrint = GetExternalSymbolSymbol(MO.getSymbolName()); 1570dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 15822854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 1590dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // If the name begins with a dollar-sign, enclose it in parens. We do this 1600dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // to avoid having it look like an integer immediate to the assembler. 16122854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach if (SymToPrint->getName()[0] != '$') 16210b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner O << *SymToPrint; 16310b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner else 16410b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattner O << '(' << *SymToPrint << '('; 1650dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 1660dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 1670dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 16822854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 1690dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner switch (MO.getTargetFlags()) { 1700dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner default: 1710dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner llvm_unreachable("Unknown target flag on GV operand"); 1720dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_NO_FLAG: // No flag. 1730dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 1740dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_DARWIN_NONLAZY: 1750dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_DLLIMPORT: 1760dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_DARWIN_STUB: 1770dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // These affect the name of the symbol, not any suffix. 1780dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 1790dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_GOT_ABSOLUTE_ADDRESS: 180142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner O << " + [.-" << *MF->getPICBaseSymbol() << ']'; 18122854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach break; 1820dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_PIC_BASE_OFFSET: 1830dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_DARWIN_NONLAZY_PIC_BASE: 1840dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE: 185142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner O << '-' << *MF->getPICBaseSymbol(); 1860dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 1870dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_TLSGD: O << "@TLSGD"; break; 188f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg case X86II::MO_TLSLD: O << "@TLSLD"; break; 189f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg case X86II::MO_TLSLDM: O << "@TLSLDM"; break; 1900dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_GOTTPOFF: O << "@GOTTPOFF"; break; 1910dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_INDNTPOFF: O << "@INDNTPOFF"; break; 1920dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_TPOFF: O << "@TPOFF"; break; 193f0234fcbc9be9798c10dedc3e3c134b7afbc6511Hans Wennborg case X86II::MO_DTPOFF: O << "@DTPOFF"; break; 1940dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_NTPOFF: O << "@NTPOFF"; break; 195228756c744a1f877f7150c8fc91e074ff58c9d66Hans Wennborg case X86II::MO_GOTNTPOFF: O << "@GOTNTPOFF"; break; 1960dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_GOTPCREL: O << "@GOTPCREL"; break; 1970dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_GOT: O << "@GOT"; break; 1980dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_GOTOFF: O << "@GOTOFF"; break; 1990dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case X86II::MO_PLT: O << "@PLT"; break; 20030ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher case X86II::MO_TLVP: O << "@TLVP"; break; 20130ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher case X86II::MO_TLVP_PIC_BASE: 202142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner O << "@TLVP" << '-' << *MF->getPICBaseSymbol(); 20330ef0e5658b0b8b04437f73f74162d5d72923f29Eric Christopher break; 20442734cfb4140287d59d3b35718d62b5f90737499Benjamin Kramer case X86II::MO_SECREL: O << "@SECREL32"; break; 2050dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 2060dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 2070dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 20835c688932a3d8f133905280f64f490f61270b2a9Chad Rosier/// printPCRelImm - This is used to print an immediate value that ends up 2090dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// being encoded as a pc-relative value. These print slightly differently, for 2100dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// example, a $ is not emitted. 21135c688932a3d8f133905280f64f490f61270b2a9Chad Rosiervoid X86AsmPrinter::printPCRelImm(const MachineInstr *MI, unsigned OpNo, 21288db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner raw_ostream &O) { 2130dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const MachineOperand &MO = MI->getOperand(OpNo); 2140dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner switch (MO.getType()) { 2150dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner default: llvm_unreachable("Unknown pcrel immediate operand"); 216323200d9057af3b653de0cceb71ae10933e09b4cDale Johannesen case MachineOperand::MO_Register: 217323200d9057af3b653de0cceb71ae10933e09b4cDale Johannesen // pc-relativeness was handled when computing the value in the reg. 218323200d9057af3b653de0cceb71ae10933e09b4cDale Johannesen printOperand(MI, OpNo, O); 219323200d9057af3b653de0cceb71ae10933e09b4cDale Johannesen return; 2200dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_Immediate: 2210dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << MO.getImm(); 2220dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return; 2230dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_MachineBasicBlock: 2241b2eb0e8a6aaf034675b17be6d853cb1c666200fChris Lattner O << *MO.getMBB()->getSymbol(); 2250dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return; 2260dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_GlobalAddress: 2270dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_ExternalSymbol: 22888db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printSymbolOperand(MO, O); 2290dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return; 2300dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 2310dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 2320dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 2330dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 2340dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnervoid X86AsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo, 2353b132fab0bebe7186348d7ab0e2663c9fddab3bbChad Rosier raw_ostream &O, const char *Modifier, 2363b132fab0bebe7186348d7ab0e2663c9fddab3bbChad Rosier unsigned AsmVariant) { 2370dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const MachineOperand &MO = MI->getOperand(OpNo); 2380dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner switch (MO.getType()) { 2390dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner default: llvm_unreachable("unknown operand type!"); 2400dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_Register: { 2413b132fab0bebe7186348d7ab0e2663c9fddab3bbChad Rosier // FIXME: Enumerating AsmVariant, so we can remove magic number. 2423b132fab0bebe7186348d7ab0e2663c9fddab3bbChad Rosier if (AsmVariant == 0) O << '%'; 2430dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner unsigned Reg = MO.getReg(); 2440dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (Modifier && strncmp(Modifier, "subreg", strlen("subreg")) == 0) { 245f4d25a2c461f7a64fcc643a6ea2541e87067d036Craig Topper MVT::SimpleValueType VT = (strcmp(Modifier+6,"64") == 0) ? 2460dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MVT::i64 : ((strcmp(Modifier+6, "32") == 0) ? MVT::i32 : 2470dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner ((strcmp(Modifier+6,"16") == 0) ? MVT::i16 : MVT::i8)); 2480dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Reg = getX86SubSuperRegister(Reg, VT); 2490dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 2500dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << X86ATTInstPrinter::getRegisterName(Reg); 2510dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return; 2520dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 2530dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 2540dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_Immediate: 2557b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier if (AsmVariant == 0) O << '$'; 2567b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier O << MO.getImm(); 2570dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return; 2580dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 2590dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_JumpTableIndex: 2600dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_ConstantPoolIndex: 26122854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach case MachineOperand::MO_GlobalAddress: 2620dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case MachineOperand::MO_ExternalSymbol: { 2637b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier if (AsmVariant == 0) O << '$'; 26488db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printSymbolOperand(MO, O); 2650dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 2660dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 2670dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 2680dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 2690dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 2700dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnervoid X86AsmPrinter::printLeaMemReference(const MachineInstr *MI, unsigned Op, 27188db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner raw_ostream &O, const char *Modifier) { 2720dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const MachineOperand &BaseReg = MI->getOperand(Op); 2730dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const MachineOperand &IndexReg = MI->getOperand(Op+2); 2740dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const MachineOperand &DispSpec = MI->getOperand(Op+3); 2750dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 2760dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // If we really don't want to print out (rip), don't. 2770dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner bool HasBaseReg = BaseReg.getReg() != 0; 2780dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (HasBaseReg && Modifier && !strcmp(Modifier, "no-rip") && 2790dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner BaseReg.getReg() == X86::RIP) 2800dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner HasBaseReg = false; 28122854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 2820dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // HasParenPart - True if we will print out the () part of the mem ref. 2830dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner bool HasParenPart = IndexReg.getReg() || HasBaseReg; 28422854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 2850dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (DispSpec.isImm()) { 2860dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner int DispVal = DispSpec.getImm(); 2870dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (DispVal || !HasParenPart) 2880dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << DispVal; 2890dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } else { 2900dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner assert(DispSpec.isGlobal() || DispSpec.isCPI() || 2910dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner DispSpec.isJTI() || DispSpec.isSymbol()); 29288db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printSymbolOperand(MI->getOperand(Op+3), O); 2930dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 2940dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 29503277e7fb4d12f0d15dc2c97787fc89ecdaecf94Rafael Espindola if (Modifier && strcmp(Modifier, "H") == 0) 29603277e7fb4d12f0d15dc2c97787fc89ecdaecf94Rafael Espindola O << "+8"; 29703277e7fb4d12f0d15dc2c97787fc89ecdaecf94Rafael Espindola 2980dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (HasParenPart) { 2990dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner assert(IndexReg.getReg() != X86::ESP && 3000dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner "X86 doesn't allow scaling by ESP"); 3010dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 3020dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << '('; 3030dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (HasBaseReg) 30488db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printOperand(MI, Op, O, Modifier); 3050dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 3060dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (IndexReg.getReg()) { 3070dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << ','; 30888db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printOperand(MI, Op+2, O, Modifier); 3090dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner unsigned ScaleVal = MI->getOperand(Op+1).getImm(); 3100dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (ScaleVal != 1) 3110dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << ',' << ScaleVal; 3120dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 3130dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << ')'; 3140dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 3150dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 3160dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 3170dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnervoid X86AsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op, 31888db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner raw_ostream &O, const char *Modifier) { 3190dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner assert(isMem(MI, Op) && "Invalid memory reference!"); 3200dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const MachineOperand &Segment = MI->getOperand(Op+4); 3210dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (Segment.getReg()) { 32288db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printOperand(MI, Op+4, O, Modifier); 3230dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << ':'; 3240dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 32588db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printLeaMemReference(MI, Op, O, Modifier); 3260dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 3270dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 32834448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosiervoid X86AsmPrinter::printIntelMemReference(const MachineInstr *MI, unsigned Op, 32934448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier raw_ostream &O, const char *Modifier, 33034448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier unsigned AsmVariant){ 33134448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier const MachineOperand &BaseReg = MI->getOperand(Op); 33234448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier unsigned ScaleVal = MI->getOperand(Op+1).getImm(); 33334448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier const MachineOperand &IndexReg = MI->getOperand(Op+2); 33434448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier const MachineOperand &DispSpec = MI->getOperand(Op+3); 33534448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier const MachineOperand &SegReg = MI->getOperand(Op+4); 33634448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier 33734448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier // If this has a segment register, print it. 33834448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier if (SegReg.getReg()) { 33934448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier printOperand(MI, Op+4, O, Modifier, AsmVariant); 34034448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier O << ':'; 34134448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier } 34234448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier 34334448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier O << '['; 34434448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier 34534448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier bool NeedPlus = false; 34634448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier if (BaseReg.getReg()) { 34734448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier printOperand(MI, Op, O, Modifier, AsmVariant); 34834448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier NeedPlus = true; 34934448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier } 35034448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier 35134448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier if (IndexReg.getReg()) { 35234448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier if (NeedPlus) O << " + "; 35334448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier if (ScaleVal != 1) 35434448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier O << ScaleVal << '*'; 35534448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier printOperand(MI, Op+2, O, Modifier, AsmVariant); 35634448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier NeedPlus = true; 35734448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier } 35834448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier 3597b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier if (!DispSpec.isImm()) { 3607b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier if (NeedPlus) O << " + "; 3617b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier printOperand(MI, Op+3, O, Modifier, AsmVariant); 3627b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier } else { 3637b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier int64_t DispVal = DispSpec.getImm(); 3647b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier if (DispVal || (!IndexReg.getReg() && !BaseReg.getReg())) { 3657b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier if (NeedPlus) { 3667b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier if (DispVal > 0) 3677b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier O << " + "; 3687b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier else { 3697b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier O << " - "; 3707b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier DispVal = -DispVal; 3717b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier } 37234448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier } 3737b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier O << DispVal; 37434448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier } 3757b0bc3fe3e8210ec7fffb311443a07d81cbe1308Chad Rosier } 37634448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier O << ']'; 37734448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier} 37834448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier 37988db786712bd1e7b1dd829e02ef960f0828a8becChris Lattnerbool X86AsmPrinter::printAsmMRegister(const MachineOperand &MO, char Mode, 38088db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner raw_ostream &O) { 3810dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner unsigned Reg = MO.getReg(); 3820dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner switch (Mode) { 3830dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner default: return true; // Unknown mode. 3840dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'b': // Print QImode register 3850dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Reg = getX86SubSuperRegister(Reg, MVT::i8); 3860dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 3870dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'h': // Print QImode high register 3880dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Reg = getX86SubSuperRegister(Reg, MVT::i8, true); 3890dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 3900dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'w': // Print HImode register 3910dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Reg = getX86SubSuperRegister(Reg, MVT::i16); 3920dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 3930dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'k': // Print SImode register 3940dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Reg = getX86SubSuperRegister(Reg, MVT::i32); 3950dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 3960dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'q': // Print DImode register 3970dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Reg = getX86SubSuperRegister(Reg, MVT::i64); 3980dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 3990dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 4000dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4010dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << '%' << X86ATTInstPrinter::getRegisterName(Reg); 4020dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4030dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 4040dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4050dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// PrintAsmOperand - Print out an operand for an inline asm expression. 4060dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner/// 4070dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnerbool X86AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 4080dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner unsigned AsmVariant, 409c75c028a15a13786eee585aa634b4faf694dd00aChris Lattner const char *ExtraCode, raw_ostream &O) { 4100dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // Does this asm operand have a single letter operand modifier? 4110dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (ExtraCode && ExtraCode[0]) { 4120dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (ExtraCode[1] != 0) return true; // Unknown modifier. 4130dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4140dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner const MachineOperand &MO = MI->getOperand(OpNo); 41522854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 4160dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner switch (ExtraCode[0]) { 4170518fca843ff87d069ecb07fc00d306c1f587d58Jack Carter default: 4180518fca843ff87d069ecb07fc00d306c1f587d58Jack Carter // See if this is a generic print operand 4190518fca843ff87d069ecb07fc00d306c1f587d58Jack Carter return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, O); 4200dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'a': // This is an address. Currently only 'i' and 'r' are expected. 4210dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.isImm()) { 4220dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << MO.getImm(); 4230dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 42422854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach } 4250dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isSymbol()) { 42688db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printSymbolOperand(MO, O); 427e2b448c20862ec3da494ef502cca0074c1301acbDale Johannesen if (Subtarget->isPICStyleRIPRel()) 428e2b448c20862ec3da494ef502cca0074c1301acbDale Johannesen O << "(%rip)"; 4290dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4300dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 4310dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.isReg()) { 4320dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << '('; 43388db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printOperand(MI, OpNo, O); 4340dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << ')'; 4350dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4360dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 4370dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return true; 4380dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4390dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'c': // Don't print "$" before a global var name or constant. 4400dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.isImm()) 4410dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << MO.getImm(); 4420dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner else if (MO.isGlobal() || MO.isCPI() || MO.isJTI() || MO.isSymbol()) 44388db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printSymbolOperand(MO, O); 4440dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner else 44588db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printOperand(MI, OpNo, O); 4460dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4470dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4480dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'A': // Print '*' before a register (it must be a register) 4490dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.isReg()) { 4500dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << '*'; 45188db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printOperand(MI, OpNo, O); 4520dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4530dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 4540dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return true; 4550dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4560dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'b': // Print QImode register 4570dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'h': // Print QImode high register 4580dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'w': // Print HImode register 4590dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'k': // Print SImode register 4600dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'q': // Print DImode register 4610dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.isReg()) 46288db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner return printAsmMRegister(MO, ExtraCode[0], O); 46388db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printOperand(MI, OpNo, O); 4640dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4650dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4660dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'P': // This is the operand of a call, treat specially. 46735c688932a3d8f133905280f64f490f61270b2a9Chad Rosier printPCRelImm(MI, OpNo, O); 4680dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4690dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4700dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'n': // Negate the immediate or print a '-' before the operand. 4710dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // Note: this is a temporary solution. It should be handled target 4720dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // independently as part of the 'MC' work. 4730dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (MO.isImm()) { 4740dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << -MO.getImm(); 4750dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4760dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 4770dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner O << '-'; 4780dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 4790dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 4800dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4813b132fab0bebe7186348d7ab0e2663c9fddab3bbChad Rosier printOperand(MI, OpNo, O, /*Modifier*/ 0, AsmVariant); 4820dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 4830dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 4840dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4850dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnerbool X86AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, 4860dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner unsigned OpNo, unsigned AsmVariant, 487c75c028a15a13786eee585aa634b4faf694dd00aChris Lattner const char *ExtraCode, 488c75c028a15a13786eee585aa634b4faf694dd00aChris Lattner raw_ostream &O) { 48934448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier if (AsmVariant) { 49034448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier printIntelMemReference(MI, OpNo, O); 49134448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier return false; 49234448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier } 49334448ae39398eeb5339a3dc6c669b4ca6791eadcChad Rosier 4940dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (ExtraCode && ExtraCode[0]) { 4950dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (ExtraCode[1] != 0) return true; // Unknown modifier. 4960dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 4970dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner switch (ExtraCode[0]) { 4980dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner default: return true; // Unknown modifier. 4990dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'b': // Print QImode register 5000dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'h': // Print QImode high register 5010dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'w': // Print HImode register 5020dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'k': // Print SImode register 5030dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'q': // Print SImode register 5040dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // These only apply to registers, ignore on mem. 5050dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner break; 50603277e7fb4d12f0d15dc2c97787fc89ecdaecf94Rafael Espindola case 'H': 50703277e7fb4d12f0d15dc2c97787fc89ecdaecf94Rafael Espindola printMemReference(MI, OpNo, O, "H"); 50803277e7fb4d12f0d15dc2c97787fc89ecdaecf94Rafael Espindola return false; 5090dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner case 'P': // Don't print @PLT, but do print as memory. 51088db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printMemReference(MI, OpNo, O, "no-rip"); 5110dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 5120dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 5130dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 51488db786712bd1e7b1dd829e02ef960f0828a8becChris Lattner printMemReference(MI, OpNo, O); 5150dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner return false; 5160dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 5170dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5181bd1e6db1d5ae9ae0f07bef5db355e8a1cf5d5b4Chris Lattnervoid X86AsmPrinter::EmitStartOfAsmFile(Module &M) { 5192bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng if (Subtarget->isTargetEnvMacho()) 5201bd1e6db1d5ae9ae0f07bef5db355e8a1cf5d5b4Chris Lattner OutStreamer.SwitchSection(getObjFileLowering().getTextSection()); 5211bd1e6db1d5ae9ae0f07bef5db355e8a1cf5d5b4Chris Lattner} 5221bd1e6db1d5ae9ae0f07bef5db355e8a1cf5d5b4Chris Lattner 5230dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5240dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattnervoid X86AsmPrinter::EmitEndOfAsmFile(Module &M) { 5252bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng if (Subtarget->isTargetEnvMacho()) { 5260dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // All darwin targets use mach-o. 5270dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MachineModuleInfoMachO &MMIMacho = 5280dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MMI->getObjFileInfo<MachineModuleInfoMachO>(); 52922854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 5300dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // Output stubs for dynamically-linked functions. 5310dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MachineModuleInfoMachO::SymbolListTy Stubs; 5320dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5330dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Stubs = MMIMacho.GetFnStubList(); 5340dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (!Stubs.empty()) { 53522854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach const MCSection *TheSection = 53622772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner OutContext.getMachOSection("__IMPORT", "__jump_table", 53722772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_SYMBOL_STUBS | 53822772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_SELF_MODIFYING_CODE | 53922772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 54022772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner 5, SectionKind::getMetadata()); 5410dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner OutStreamer.SwitchSection(TheSection); 5420dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5430dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 544beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner // L_foo$stub: 545beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner OutStreamer.EmitLabel(Stubs[i].first); 546beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner // .indirect_symbol _foo 547cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling OutStreamer.EmitSymbolAttribute(Stubs[i].second.getPointer(), 548cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling MCSA_IndirectSymbol); 549cda2a146d1fcf3f499a1aa535377fb332e918bd5Jeffrey Yasskin // hlt; hlt; hlt; hlt; hlt hlt = 0xf4. 550cda2a146d1fcf3f499a1aa535377fb332e918bd5Jeffrey Yasskin const char HltInsts[] = "\xf4\xf4\xf4\xf4\xf4"; 55168ca56285f9b6e82eb16ff8ea02a301f2c489faeEric Christopher OutStreamer.EmitBytes(StringRef(HltInsts, 5)); 5520dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 55322854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach 5540dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Stubs.clear(); 555beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner OutStreamer.AddBlankLine(); 5560dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 5570dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5580dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // Output stubs for external and common global variables. 5590dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Stubs = MMIMacho.GetGVStubList(); 5600dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (!Stubs.empty()) { 56122854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbach const MCSection *TheSection = 56222772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner OutContext.getMachOSection("__IMPORT", "__pointers", 56322772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 56422772214de79aa1c5ca38c4fb1da137d8fb30a05Chris Lattner SectionKind::getMetadata()); 5650dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner OutStreamer.SwitchSection(TheSection); 5660dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5670dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 568beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner // L_foo$non_lazy_ptr: 569beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner OutStreamer.EmitLabel(Stubs[i].first); 570beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner // .indirect_symbol _foo 571ec041eba384a5553b47295361fde15acc21d5607Bill Wendling MachineModuleInfoImpl::StubValueTy &MCSym = Stubs[i].second; 572ec041eba384a5553b47295361fde15acc21d5607Bill Wendling OutStreamer.EmitSymbolAttribute(MCSym.getPointer(), 573cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling MCSA_IndirectSymbol); 574beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner // .long 0 575ec041eba384a5553b47295361fde15acc21d5607Bill Wendling if (MCSym.getInt()) 576ec041eba384a5553b47295361fde15acc21d5607Bill Wendling // External to current translation unit. 57768ca56285f9b6e82eb16ff8ea02a301f2c489faeEric Christopher OutStreamer.EmitIntValue(0, 4/*size*/); 578ec041eba384a5553b47295361fde15acc21d5607Bill Wendling else 579ec041eba384a5553b47295361fde15acc21d5607Bill Wendling // Internal to current translation unit. 580d93bf04a0733210c376a79bc30570a58516b330cBill Wendling // 581d93bf04a0733210c376a79bc30570a58516b330cBill Wendling // When we place the LSDA into the TEXT section, the type info 582d93bf04a0733210c376a79bc30570a58516b330cBill Wendling // pointers need to be indirect and pc-rel. We accomplish this by 583d93bf04a0733210c376a79bc30570a58516b330cBill Wendling // using NLPs. However, sometimes the types are local to the file. So 584d93bf04a0733210c376a79bc30570a58516b330cBill Wendling // we need to fill in the value for the NLP in those cases. 585ec041eba384a5553b47295361fde15acc21d5607Bill Wendling OutStreamer.EmitValue(MCSymbolRefExpr::Create(MCSym.getPointer(), 58668ca56285f9b6e82eb16ff8ea02a301f2c489faeEric Christopher OutContext), 4/*size*/); 5870dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 5880dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Stubs.clear(); 589beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner OutStreamer.AddBlankLine(); 5900dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 5910dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5920dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Stubs = MMIMacho.GetHiddenGVStubList(); 5930dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner if (!Stubs.empty()) { 5940dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner OutStreamer.SwitchSection(getObjFileLowering().getDataSection()); 5950dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner EmitAlignment(2); 5960dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 5970dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 598beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner // L_foo$non_lazy_ptr: 599beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner OutStreamer.EmitLabel(Stubs[i].first); 600beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner // .long _foo 601cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling OutStreamer.EmitValue(MCSymbolRefExpr:: 602cebae36f57456fe6b0e13726acd1e0250654f02dBill Wendling Create(Stubs[i].second.getPointer(), 60368ca56285f9b6e82eb16ff8ea02a301f2c489faeEric Christopher OutContext), 4/*size*/); 6040dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 6050dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner Stubs.clear(); 606beb42691b1b58664e99cdc61cb5f4900298b432aChris Lattner OutStreamer.AddBlankLine(); 6070dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 6080dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 6090dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // Funny Darwin hack: This flag tells the linker that no global symbols 6100dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // contain code that falls through to other global symbols (e.g. the obvious 6110dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // implementation of multiple entry points). If this doesn't occur, the 6120dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // linker can safely perform dead code stripping. Since LLVM never 6130dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner // generates code that does this, it is always safe to set. 614a5ad93a10a5435f21090b09edb6b3a7e44967648Chris Lattner OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols); 6154fac9470c4d2e1055bd086f953a1938bde4961ecAnton Korobeynikov } 6160dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 617a29aae7aca6d8b9a9e95238d7e4067d8c16b0079Chris Lattner if (Subtarget->isTargetWindows() && !Subtarget->isTargetCygMing() && 618c9c137b463b953fbf8942f655d67f6dc1a0f7965Michael J. Spencer MMI->usesVAFloatArgument()) { 619c527407010fadcbca0bc394ada311f2122df2bc0Michael J. Spencer StringRef SymbolName = Subtarget->is64Bit() ? "_fltused" : "__fltused"; 620c527407010fadcbca0bc394ada311f2122df2bc0Michael J. Spencer MCSymbol *S = MMI->getContext().GetOrCreateSymbol(SymbolName); 62184ac4d5a2a8fd0e6f95ec46088c0ca7bb63423acMichael J. Spencer OutStreamer.EmitSymbolAttribute(S, MCSA_Global); 62284ac4d5a2a8fd0e6f95ec46088c0ca7bb63423acMichael J. Spencer } 62384ac4d5a2a8fd0e6f95ec46088c0ca7bb63423acMichael J. Spencer 6242bffee2ee725047137d2523e31db9ecc7b246cbbEvan Cheng if (Subtarget->isTargetCOFF() && !Subtarget->isTargetEnvMacho()) { 6254fac9470c4d2e1055bd086f953a1938bde4961ecAnton Korobeynikov X86COFFMachineModuleInfo &COFFMMI = 6260dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner MMI->getObjFileInfo<X86COFFMachineModuleInfo>(); 6270dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 6284fac9470c4d2e1055bd086f953a1938bde4961ecAnton Korobeynikov // Emit type information for external functions 629b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner typedef X86COFFMachineModuleInfo::externals_iterator externals_iterator; 630b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner for (externals_iterator I = COFFMMI.externals_begin(), 631b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner E = COFFMMI.externals_end(); 632b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner I != E; ++I) { 633b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OutStreamer.BeginCOFFSymbolDef(CurrentFnSym); 6349fe2c6704582a6730f4fc99dd85e214b23f3494bChris Lattner OutStreamer.EmitCOFFSymbolStorageClass(COFF::IMAGE_SYM_CLASS_EXTERNAL); 6359fe2c6704582a6730f4fc99dd85e214b23f3494bChris Lattner OutStreamer.EmitCOFFSymbolType(COFF::IMAGE_SYM_DTYPE_FUNCTION 6369fe2c6704582a6730f4fc99dd85e214b23f3494bChris Lattner << COFF::SCT_COMPLEX_TYPE_SHIFT); 637b54b9ddaaf2d258767d360583642ed1b91075fc9Chris Lattner OutStreamer.EndCOFFSymbolDef(); 6380dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 6394fac9470c4d2e1055bd086f953a1938bde4961ecAnton Korobeynikov 640071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords // Necessary for dllexport support 641071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords std::vector<const MCSymbol*> DLLExportedFns, DLLExportedGlobals; 642071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords 643071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords const TargetLoweringObjectFileCOFF &TLOFCOFF = 644071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords static_cast<const TargetLoweringObjectFileCOFF&>(getObjFileLowering()); 645071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords 646071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) 647071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords if (I->hasDLLExportLinkage()) 648071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords DLLExportedFns.push_back(Mang->getSymbol(I)); 649071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords 650071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords for (Module::const_global_iterator I = M.global_begin(), 651071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords E = M.global_end(); I != E; ++I) 652071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords if (I->hasDLLExportLinkage()) 653071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords DLLExportedGlobals.push_back(Mang->getSymbol(I)); 654071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords 655071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords // Output linker support code for dllexported globals on windows. 656071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords if (!DLLExportedGlobals.empty() || !DLLExportedFns.empty()) { 657071de920a0811a908be46953624867a82f2b22d8Nathan Jeffords OutStreamer.SwitchSection(TLOFCOFF.getDrectveSection()); 658bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords SmallString<128> name; 659bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords for (unsigned i = 0, e = DLLExportedGlobals.size(); i != e; ++i) { 660bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords if (Subtarget->isTargetWindows()) 661bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name = " /EXPORT:"; 662bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords else 663bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name = " -export:"; 664bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name += DLLExportedGlobals[i]->getName(); 665bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords if (Subtarget->isTargetWindows()) 666bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name += ",DATA"; 667bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords else 668bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name += ",data"; 66968ca56285f9b6e82eb16ff8ea02a301f2c489faeEric Christopher OutStreamer.EmitBytes(name); 670bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords } 671bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords 672bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords for (unsigned i = 0, e = DLLExportedFns.size(); i != e; ++i) { 673bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords if (Subtarget->isTargetWindows()) 674bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name = " /EXPORT:"; 675bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords else 676bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name = " -export:"; 677bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords name += DLLExportedFns[i]->getName(); 67868ca56285f9b6e82eb16ff8ea02a301f2c489faeEric Christopher OutStreamer.EmitBytes(name); 679bb59732d1887091c4c2f6e1d65c74fdf4777b555Nathan Jeffords } 6800dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 6810dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner } 6829184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 6839184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov if (Subtarget->isTargetELF()) { 6840d805c33d134d88169e3dc4a3272cff9a5713ce7Dan Gohman const TargetLoweringObjectFileELF &TLOFELF = 6850d805c33d134d88169e3dc4a3272cff9a5713ce7Dan Gohman static_cast<const TargetLoweringObjectFileELF &>(getObjFileLowering()); 6869184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 6879184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>(); 6889184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 6899184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov // Output stubs for external and common global variables. 6909184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList(); 6919184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov if (!Stubs.empty()) { 6929184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov OutStreamer.SwitchSection(TLOFELF.getDataRelSection()); 6933574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow const DataLayout *TD = TM.getDataLayout(); 6949184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 695c82d9c4e5cfa856b8f23f595645f5e1ed7415747Chris Lattner for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { 696c82d9c4e5cfa856b8f23f595645f5e1ed7415747Chris Lattner OutStreamer.EmitLabel(Stubs[i].first); 697c82d9c4e5cfa856b8f23f595645f5e1ed7415747Chris Lattner OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(), 69868ca56285f9b6e82eb16ff8ea02a301f2c489faeEric Christopher TD->getPointerSize()); 699c82d9c4e5cfa856b8f23f595645f5e1ed7415747Chris Lattner } 7009184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov Stubs.clear(); 7019184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 7029184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 7030dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 7040dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 7050dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner//===----------------------------------------------------------------------===// 7060dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner// Target Registry Stuff 7070dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner//===----------------------------------------------------------------------===// 7080dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner 7090dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner// Force static initialization. 71022854b777e37b07d65376bedeeab004f68d5ca5dJim Grosbachextern "C" void LLVMInitializeX86AsmPrinter() { 7110dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner RegisterAsmPrinter<X86AsmPrinter> X(TheX86_32Target); 7120dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner RegisterAsmPrinter<X86AsmPrinter> Y(TheX86_64Target); 7130dc32ea0ef14c7e7f88edb12763a7828052a7fbdChris Lattner} 714