AsmPrinter.cpp revision 412c3a5bc9e70fe8579551216786e70d323a3dd5
1a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===-- AsmPrinter.cpp - Common AsmPrinter code ---------------------------===// 2a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 3a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// The LLVM Compiler Infrastructure 4a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 8a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===// 9a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 10a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// This file implements the AsmPrinter class. 11a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 12a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===// 13a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 14932f022b826c7b0b821c6a5369e18e4ebdceeb4cEvan Cheng#include "llvm/CodeGen/AsmPrinter.h" 15246ae0dcf750401ee84e1319ebe0b790744097a5Evan Cheng#include "llvm/Assembly/Writer.h" 168cfa57b1b4eade4e0101195b2f94ab288cd03563Nate Begeman#include "llvm/DerivedTypes.h" 17a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#include "llvm/Constants.h" 18450de393acdf4be89db8558522b04d8111e4562bChris Lattner#include "llvm/Module.h" 195eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen#include "llvm/CodeGen/GCMetadataPrinter.h" 203b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner#include "llvm/CodeGen/MachineConstantPool.h" 211924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene#include "llvm/CodeGen/MachineFrameInfo.h" 22fe37ab335be5632eab561d49984c95cb06b946d4David Greene#include "llvm/CodeGen/MachineFunction.h" 2337efe6764568a3829fee26aba532283131d1a104Nate Begeman#include "llvm/CodeGen/MachineJumpTableInfo.h" 24b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene#include "llvm/CodeGen/MachineLoopInfo.h" 2584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineModuleInfo.h" 26c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel#include "llvm/CodeGen/DwarfWriter.h" 27cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis#include "llvm/Analysis/DebugInfo.h" 282b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner#include "llvm/MC/MCContext.h" 293ac1ab835caacdeebbd0d7b4d69160f283928d21David Greene#include "llvm/MC/MCInst.h" 30a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCSection.h" 31a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner#include "llvm/MC/MCStreamer.h" 327cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner#include "llvm/MC/MCSymbol.h" 3342bf74be1402df7409efbea089310d4c276fde37Evan Cheng#include "llvm/Support/CommandLine.h" 347d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/ErrorHandling.h" 35014700c1a8cba203fd21ff129426ba8a426ab244David Greene#include "llvm/Support/FormattedStream.h" 36a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#include "llvm/Support/Mangler.h" 37af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h" 3807000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h" 391924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene#include "llvm/Target/TargetInstrInfo.h" 400336fdba858830d515bf53ac29b8e5ff24dfa823Chris Lattner#include "llvm/Target/TargetLowering.h" 41f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner#include "llvm/Target/TargetLoweringObjectFile.h" 426547e406cf934346db7a206b61bcf09635afff0dEvan Cheng#include "llvm/Target/TargetOptions.h" 43da47e6e0d003c873da960361549e57ee4617c301Evan Cheng#include "llvm/Target/TargetRegisterInfo.h" 44cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng#include "llvm/ADT/SmallPtrSet.h" 45fad86b003a839cef40ec8ce8408322f4913368caChris Lattner#include "llvm/ADT/SmallString.h" 46cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson#include "llvm/ADT/StringExtras.h" 476609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner#include <cerrno> 48a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnerusing namespace llvm; 49a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 5042bf74be1402df7409efbea089310d4c276fde37Evan Chengstatic cl::opt<cl::boolOrDefault> 5142bf74be1402df7409efbea089310d4c276fde37Evan ChengAsmVerbose("asm-verbose", cl::desc("Add comments to directives."), 5242bf74be1402df7409efbea089310d4c276fde37Evan Cheng cl::init(cl::BOU_UNSET)); 5342bf74be1402df7409efbea089310d4c276fde37Evan Cheng 541997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar AsmPrinter::ID = 0; 5571847813bc419f7a0667468136a07429c6d9f164David GreeneAsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, 56af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *T, bool VDef) 575bcc8bd0c60cfe583ee47852950aad9e532c932eDaniel Dunbar : MachineFunctionPass(&ID), FunctionNumber(0), O(o), 5833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner TM(tm), MAI(T), TRI(tm.getRegisterInfo()), 592b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 602b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner OutContext(*new MCContext()), 6190edac0e8b35f766599362b6301863229f0ddcdbChris Lattner // FIXME: Pass instprinter to streamer. 6290edac0e8b35f766599362b6301863229f0ddcdbChris Lattner OutStreamer(*createAsmStreamer(OutContext, O, *T, 0)), 632b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 64290c2f56ce551ebcf4480ac2944986fe4bb339e9Chris Lattner LastMI(0), LastFn(0), Counter(~0U), 65a1434045c32eb6818354a607b84d99353af759b0Devang Patel PrevDLT(0, 0, ~0U, ~0U) { 660de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW = 0; MMI = 0; 6742bf74be1402df7409efbea089310d4c276fde37Evan Cheng switch (AsmVerbose) { 6842bf74be1402df7409efbea089310d4c276fde37Evan Cheng case cl::BOU_UNSET: VerboseAsm = VDef; break; 6942bf74be1402df7409efbea089310d4c276fde37Evan Cheng case cl::BOU_TRUE: VerboseAsm = true; break; 7042bf74be1402df7409efbea089310d4c276fde37Evan Cheng case cl::BOU_FALSE: VerboseAsm = false; break; 7142bf74be1402df7409efbea089310d4c276fde37Evan Cheng } 7242bf74be1402df7409efbea089310d4c276fde37Evan Cheng} 73ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 74c317a60c2714a5b90700a11ba646285cb754a5d3Gordon HenriksenAsmPrinter::~AsmPrinter() { 75c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen for (gcp_iterator I = GCMetadataPrinters.begin(), 76c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen E = GCMetadataPrinters.end(); I != E; ++I) 77c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen delete I->second; 782b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 792b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner delete &OutStreamer; 802b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner delete &OutContext; 81c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen} 82ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 8338c398808cff7defdf013fa750dfac8e66302975Chris LattnerTargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const { 84f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner return TM.getTargetLowering()->getObjFileLowering(); 85f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner} 86f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 87dabf07c70a5e13a4560d75667fa5c7db28921a92Chris Lattner/// getCurrentSection() - Return the current section we are emitting to. 88dabf07c70a5e13a4560d75667fa5c7db28921a92Chris Lattnerconst MCSection *AsmPrinter::getCurrentSection() const { 89dabf07c70a5e13a4560d75667fa5c7db28921a92Chris Lattner return OutStreamer.getCurrentSection(); 90b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov} 914632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner 92dabf07c70a5e13a4560d75667fa5c7db28921a92Chris Lattner 93ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksenvoid AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { 94845012e6d31799c7fbd1193fa1af8ee2d12e9231Dan Gohman AU.setPreservesAll(); 95ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen MachineFunctionPass::getAnalysisUsage(AU); 965eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen AU.addRequired<GCModuleInfo>(); 97fe37ab335be5632eab561d49984c95cb06b946d4David Greene if (VerboseAsm) 98b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene AU.addRequired<MachineLoopInfo>(); 99ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen} 100ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 101a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnerbool AsmPrinter::doInitialization(Module &M) { 102f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner // Initialize TargetLoweringObjectFile. 103f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner const_cast<TargetLoweringObjectFile&>(getObjFileLowering()) 104f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner .Initialize(OutContext, TM); 105f26e03bc7e30162197641406e37e662a15d80f7eChris Lattner 10633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner Mang = new Mangler(M, MAI->getGlobalPrefix(), MAI->getPrivateGlobalPrefix(), 10733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner MAI->getLinkerPrivateGlobalPrefix()); 1082c1b1597f244c836771b4f2668c0ae399d32a5e9Chris Lattner 10933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->doesAllowQuotesInName()) 110a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner Mang->setUseQuotes(true); 111c6f729ed5519cdf398ca4039dbdbea4f81433ec0Anton Korobeynikov 112c6f729ed5519cdf398ca4039dbdbea4f81433ec0Anton Korobeynikov if (MAI->doesAllowNameToStartWithDigit()) 113c6f729ed5519cdf398ca4039dbdbea4f81433ec0Anton Korobeynikov Mang->setSymbolsCanStartWithDigit(true); 114a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner 115812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson // Allow the target to emit any magic that it wants at the start of the file. 116812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson EmitStartOfAsmFile(M); 117952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola 11833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->hasSingleParameterDotFile()) { 119952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola /* Very minimal debug info. It is ignored if we emit actual 120bc9506f5eec2ff5f05f66b03e13a5fd678fd9134Bob Wilson debug info. If we don't, this at least helps the user find where 121952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola a function came from. */ 122952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola O << "\t.file\t\"" << M.getModuleIdentifier() << "\"\n"; 123952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola } 124952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola 125812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 126812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 1275eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I) 1285eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) 12933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner MP->beginAssembly(O, *this, *MAI); 130ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 1313e2fa7a746270452316523f27b9055b007feba32Chris Lattner if (!M.getModuleInlineAsm().empty()) 13233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " Start of file scope inline assembly\n" 1333e2fa7a746270452316523f27b9055b007feba32Chris Lattner << M.getModuleInlineAsm() 13433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner << '\n' << MAI->getCommentString() 135563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey << " End of file scope inline assembly\n"; 1362c1b1597f244c836771b4f2668c0ae399d32a5e9Chris Lattner 137b55e068e53fccc609b7d9cd198ed9818c188a196Chris Lattner MMI = getAnalysisIfAvailable<MachineModuleInfo>(); 138b55e068e53fccc609b7d9cd198ed9818c188a196Chris Lattner if (MMI) 139b55e068e53fccc609b7d9cd198ed9818c188a196Chris Lattner MMI->AnalyzeModule(M); 140b55e068e53fccc609b7d9cd198ed9818c188a196Chris Lattner DW = getAnalysisIfAvailable<DwarfWriter>(); 1419a501cf19dbf1f56f0782ddba4c1931565af9610Sanjiv Gupta if (DW) 142b55e068e53fccc609b7d9cd198ed9818c188a196Chris Lattner DW->BeginModule(&M, MMI, O, this, MAI); 14314a55d952cf238fff42da53a75f39cf06dab184bDevang Patel 144a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner return false; 145a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 146a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 147a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnerbool AsmPrinter::doFinalization(Module &M) { 14840bbebde9d250b875a47a688d0c6552834ada48fChris Lattner // Emit global variables. 14940bbebde9d250b875a47a688d0c6552834ada48fChris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 15040bbebde9d250b875a47a688d0c6552834ada48fChris Lattner I != E; ++I) 15140bbebde9d250b875a47a688d0c6552834ada48fChris Lattner PrintGlobalVariable(I); 15240bbebde9d250b875a47a688d0c6552834ada48fChris Lattner 1531f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner // Emit final debug information. 15433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->doesSupportDebugInformation() || MAI->doesSupportExceptionHandling()) 1551f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner DW->EndModule(); 1561f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner 1570a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // If the target wants to know about weak references, print them all. 15833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getWeakRefDirective()) { 1590a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // FIXME: This is not lazy, it would be nice to only print weak references 1600a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // to stuff that is actually used. Note that doing so would require targets 1610a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // to notice uses in operands (due to constant exprs etc). This should 1620a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // happen with the MC stuff eventually. 1630a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner 1640a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // Print out module-level global variables here. 1650a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 1660a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 1670a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner if (I->hasExternalWeakLinkage()) 16833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n'; 1690a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner } 1700a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner 171c6fdced3dbfdf673cc9b01dfad4f08e316d8803dChris Lattner for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) { 1720a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner if (I->hasExternalWeakLinkage()) 17333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n'; 1740a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner } 17515404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola } 17615404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola 17733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getSetDirective()) { 178d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 1798b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); 1800a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 1815c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner MCSymbol *Name = GetGlobalValueSymbol(I); 182325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov 183325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal()); 1845c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner MCSymbol *Target = GetGlobalValueSymbol(GV); 1855c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner 1865c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner if (I->hasExternalLinkage() || !MAI->getWeakRefDirective()) { 1875c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner O << "\t.globl\t"; 1885c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner Name->print(O, MAI); 1895c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner O << '\n'; 1905c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner } else if (I->hasWeakLinkage()) { 1915c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner O << MAI->getWeakRefDirective(); 1925c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner Name->print(O, MAI); 1935c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner O << '\n'; 1945c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner } else { 1955c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner assert(!I->hasLocalLinkage() && "Invalid alias linkage"); 1965c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner } 19722c9e65643e0c6b43be37a19e59491ef0081092cAnton Korobeynikov 198541af7f769c89de8a7f52d563cf317ad7a86c245Anton Korobeynikov printVisibility(Name, I->getVisibility()); 19922c9e65643e0c6b43be37a19e59491ef0081092cAnton Korobeynikov 2005c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner O << MAI->getSetDirective() << ' '; 2015c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner Name->print(O, MAI); 2025c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner O << ", "; 2035c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner Target->print(O, MAI); 2045c40e694dcd679bf26b962189c1d12b32fff07cdChris Lattner O << '\n'; 2058b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov } 2068b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov } 2078b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2081465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 2095eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 2105eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) 2115eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I)) 21233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner MP->finishAssembly(O, *this, *MAI); 213ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 214a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman // If we don't have any trampolines, then we don't require stack memory 215a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman // to be executable. Some targets have a directive to declare this. 2160a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); 217a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) 21833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getNonexecutableStackDirective()) 21933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getNonexecutableStackDirective() << '\n'; 220a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman 221bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner 222bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner // Allow the target to emit any magic that it wants at the end of the file, 223bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner // after everything else has gone out. 224bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner EmitEndOfAsmFile(M); 225bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner 226a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner delete Mang; Mang = 0; 2270de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW = 0; MMI = 0; 2282b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 2292b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner OutStreamer.Finish(); 230a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner return false; 231a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 232a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 23325045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattnervoid AsmPrinter::SetupMachineFunction(MachineFunction &MF) { 234412c3a5bc9e70fe8579551216786e70d323a3dd5Chris Lattner // Get the function symbol. 235d1947ed2f824d2e9f4923fb6efc2aec4a6e3e96dChris Lattner CurrentFnSym = GetGlobalValueSymbol(MF.getFunction()); 236347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng IncrementFunctionNumber(); 237b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 23825d812bd7d1f58f2ba1b598b1425a2e146e27381Chris Lattner if (VerboseAsm) 239b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene LI = &getAnalysis<MachineLoopInfo>(); 240a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 241a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 2421606e8e4cd937e6de6681f686c266cf61722d972Evan Chengnamespace { 2431606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // SectionCPs - Keep track the alignment, constpool entries per Section. 2441606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng struct SectionCPs { 245a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner const MCSection *S; 2461606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Alignment; 2471606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SmallVector<unsigned, 4> CPEs; 248cabdd7425d30f7eb659ecb0cc5efbc4052dd78a8Douglas Gregor SectionCPs(const MCSection *s, unsigned a) : S(s), Alignment(a) {} 2491606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng }; 2501606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng} 2511606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 2523b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// EmitConstantPool - Print to the current output stream assembly 2533b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// representations of the constants in the constant pool MCP. This is 2543b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// used to print out constants which have been "spilled to memory" by 2553b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// the code generator. 2563b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// 2573b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattnervoid AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) { 258fa77d43ba1d91ed39f46e11caeb28dcabae9e193Chris Lattner const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants(); 2593b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner if (CP.empty()) return; 2602d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 261088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // Calculate sections for constant pool entries. We collect entries to go into 262088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // the same section together to reduce amount of section switch statements. 2631606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SmallVector<SectionCPs, 4> CPSections; 2642d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng for (unsigned i = 0, e = CP.size(); i != e; ++i) { 265298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner const MachineConstantPoolEntry &CPE = CP[i]; 2661606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Align = CPE.getAlignment(); 2675c2f789952ff315021afb10381f141f2ac3b1a6bChris Lattner 2685c2f789952ff315021afb10381f141f2ac3b1a6bChris Lattner SectionKind Kind; 2695c2f789952ff315021afb10381f141f2ac3b1a6bChris Lattner switch (CPE.getRelocationInfo()) { 2705c2f789952ff315021afb10381f141f2ac3b1a6bChris Lattner default: llvm_unreachable("Unknown section kind"); 2712798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 2: Kind = SectionKind::getReadOnlyWithRel(); break; 2724c50922f6be96fdb1e9a924aeeecf91638e2c52bChris Lattner case 1: 2732798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner Kind = SectionKind::getReadOnlyWithRelLocal(); 2744c50922f6be96fdb1e9a924aeeecf91638e2c52bChris Lattner break; 2755c2f789952ff315021afb10381f141f2ac3b1a6bChris Lattner case 0: 2764c50922f6be96fdb1e9a924aeeecf91638e2c52bChris Lattner switch (TM.getTargetData()->getTypeAllocSize(CPE.getType())) { 2772798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 4: Kind = SectionKind::getMergeableConst4(); break; 2782798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 8: Kind = SectionKind::getMergeableConst8(); break; 2792798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner case 16: Kind = SectionKind::getMergeableConst16();break; 2802798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner default: Kind = SectionKind::getMergeableConst(); break; 2814c50922f6be96fdb1e9a924aeeecf91638e2c52bChris Lattner } 2825c2f789952ff315021afb10381f141f2ac3b1a6bChris Lattner } 2835c2f789952ff315021afb10381f141f2ac3b1a6bChris Lattner 28483d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner const MCSection *S = getObjFileLowering().getSectionForConstant(Kind); 285298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner 2861606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // The number of sections are small, just do a linear search from the 2871606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // last section to the first. 2881606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng bool Found = false; 2891606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned SecIdx = CPSections.size(); 2901606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng while (SecIdx != 0) { 2911606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (CPSections[--SecIdx].S == S) { 2921606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng Found = true; 2931606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng break; 2941606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 2951606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 2961606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (!Found) { 2971606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SecIdx = CPSections.size(); 2981606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections.push_back(SectionCPs(S, Align)); 2991606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 3001606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3011606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (Align > CPSections[SecIdx].Alignment) 3021606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections[SecIdx].Alignment = Align; 3031606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections[SecIdx].CPEs.push_back(i); 3042d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng } 3052d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 306088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // Now print stuff into the calculated sections. 3071606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng for (unsigned i = 0, e = CPSections.size(); i != e; ++i) { 3086c2f9e14fdf14d8c1c687c6bd9918183fa7f8a7fChris Lattner OutStreamer.SwitchSection(CPSections[i].S); 3091606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitAlignment(Log2_32(CPSections[i].Alignment)); 3102d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 3111606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Offset = 0; 3121606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) { 3131606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned CPI = CPSections[i].CPEs[j]; 3141606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng MachineConstantPoolEntry CPE = CP[CPI]; 3151606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3161606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // Emit inter-object padding for alignment. 3171606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned AlignMask = CPE.getAlignment() - 1; 3181606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned NewOffset = (Offset + AlignMask) & ~AlignMask; 3191606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitZeros(NewOffset - Offset); 3201606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3211606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng const Type *Ty = CPE.getType(); 322777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty); 3232d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 32433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' 325a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman << CPI << ':'; 3261606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (VerboseAsm) { 32733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 32833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " constant "; 329cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman WriteTypeSymbolic(O, CPE.getType(), MF->getFunction()->getParent()); 3301606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 331088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov O << '\n'; 3321606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (CPE.isMachineConstantPoolEntry()) 3331606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitMachineConstantPoolValue(CPE.Val.MachineCPVal); 334088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov else 3351606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitGlobalConstant(CPE.Val.ConstVal); 3363029f920519e0871a5aad5d7c592281093953733Chris Lattner } 3373b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner } 3383b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner} 3393b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner 34037efe6764568a3829fee26aba532283131d1a104Nate Begeman/// EmitJumpTableInfo - Print assembly representations of the jump tables used 34137efe6764568a3829fee26aba532283131d1a104Nate Begeman/// by the current function to the current output stream. 34237efe6764568a3829fee26aba532283131d1a104Nate Begeman/// 3431da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattnervoid AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI, 3441da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner MachineFunction &MF) { 34537efe6764568a3829fee26aba532283131d1a104Nate Begeman const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 34637efe6764568a3829fee26aba532283131d1a104Nate Begeman if (JT.empty()) return; 3479de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 348acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 3494d9bbdc4408cc871d229677313cc4887862719d7Nate Begeman 3502f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman // Pick the directive to use to print the jump table entries, and switch to 3512f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman // the appropriate section. 352acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey TargetLowering *LoweringInfo = TM.getTargetLowering(); 35324287ddb81aca5d2579dc30ebd3528d2521529d7Anton Korobeynikov 354e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov const Function *F = MF.getFunction(); 355b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng bool JTInDiffSection = false; 35683d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner if (F->isWeakForLinker() || 35783d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner (IsPic && !LoweringInfo->usesGlobalOffsetTable())) { 358acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey // In PIC mode, we need to emit the jump table to the same section as the 359acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey // function body itself, otherwise the label differences won't make sense. 360e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov // We should also do if the section name is NULL or function is declared in 361e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov // discardable section. 3626c2f9e14fdf14d8c1c687c6bd9918183fa7f8a7fChris Lattner OutStreamer.SwitchSection(getObjFileLowering().SectionForGlobal(F, Mang, 3636c2f9e14fdf14d8c1c687c6bd9918183fa7f8a7fChris Lattner TM)); 3642f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman } else { 36583d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner // Otherwise, drop it in the readonly section. 36683d77faf6e8fc2c1c2377d037283dc162d8667a1Chris Lattner const MCSection *ReadOnlySection = 3672798119ab4d7e0b42812b3acdf37821f40dee627Chris Lattner getObjFileLowering().getSectionForConstant(SectionKind::getReadOnly()); 3686c2f9e14fdf14d8c1c687c6bd9918183fa7f8a7fChris Lattner OutStreamer.SwitchSection(ReadOnlySection); 369b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng JTInDiffSection = true; 3702f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman } 371acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey 372acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey EmitAlignment(Log2_32(MJTI->getAlignment())); 3730c4e6789da4dba6c7b0010886776b24dec3f3bb8Chris Lattner 37437efe6764568a3829fee26aba532283131d1a104Nate Begeman for (unsigned i = 0, e = JT.size(); i != e; ++i) { 37552a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman const std::vector<MachineBasicBlock*> &JTBBs = JT[i].MBBs; 37607371882208f913d18a7f2a47373eaee7138416bChris Lattner 37707371882208f913d18a7f2a47373eaee7138416bChris Lattner // If this jump table was deleted, ignore it. 37807371882208f913d18a7f2a47373eaee7138416bChris Lattner if (JTBBs.empty()) continue; 37952a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 38052a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // For PIC codegen, if possible we want to use the SetDirective to reduce 38152a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // the number of relocations the assembler will generate for the jump table. 38252a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // Set directives are all printed before the jump table itself. 383cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng SmallPtrSet<MachineBasicBlock*, 16> EmittedSets; 38433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getSetDirective() && IsPic) 38552a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) 386cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng if (EmittedSets.insert(JTBBs[ii])) 387cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng printPICJumpTableSetLabel(i, JTBBs[ii]); 38852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 3897c30191393c99c9ba804f1a01942a9e130c53904Chris Lattner // On some targets (e.g. Darwin) we want to emit two consequtive labels 390393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // before each jump table. The first label is never referenced, but tells 391393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // the assembler and linker the extents of the jump table object. The 392393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // second label is actually referenced by the code. 3937c30191393c99c9ba804f1a01942a9e130c53904Chris Lattner if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) { 3947c30191393c99c9ba804f1a01942a9e130c53904Chris Lattner O << MAI->getLinkerPrivateGlobalPrefix() 3957c30191393c99c9ba804f1a01942a9e130c53904Chris Lattner << "JTI" << getFunctionNumber() << '_' << i << ":\n"; 396b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng } 397393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner 39833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 399347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << i << ":\n"; 40052a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 40137efe6764568a3829fee26aba532283131d1a104Nate Begeman for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { 4029de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov printPICJumpTableEntry(MJTI, JTBBs[ii], i); 40337efe6764568a3829fee26aba532283131d1a104Nate Begeman O << '\n'; 40437efe6764568a3829fee26aba532283131d1a104Nate Begeman } 40537efe6764568a3829fee26aba532283131d1a104Nate Begeman } 40637efe6764568a3829fee26aba532283131d1a104Nate Begeman} 40737efe6764568a3829fee26aba532283131d1a104Nate Begeman 4089de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikovvoid AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 4099de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const MachineBasicBlock *MBB, 4109de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov unsigned uid) const { 411b3ac6e40d9dd3bc8157edc47004f39c8f382dc9eChris Lattner bool isPIC = TM.getRelocationModel() == Reloc::PIC_; 4129de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4139de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // Use JumpTableDirective otherwise honor the entry size from the jump table 4149de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // info. 41533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner const char *JTEntryDirective = MAI->getJumpTableDirective(isPIC); 4169de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov bool HadJTEntryDirective = JTEntryDirective != NULL; 4179de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (!HadJTEntryDirective) { 4189de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov JTEntryDirective = MJTI->getEntrySize() == 4 ? 41933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner MAI->getData32bitsDirective() : MAI->getData64bitsDirective(); 4209de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4219de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4229de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov O << JTEntryDirective << ' '; 4239de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4249de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If we have emitted set directives for the jump table entries, print 4259de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // them rather than the entries themselves. If we're emitting PIC, then 4269de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // emit the table entries as differences between two text section labels. 4279de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If we're emitting non-PIC code, then emit the entries as direct 4289de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // references to the target basic blocks. 429b3ac6e40d9dd3bc8157edc47004f39c8f382dc9eChris Lattner if (!isPIC) { 430325d3dcfe4d5efc91db0f59b20a72a11dea024edChris Lattner GetMBBSymbol(MBB->getNumber())->print(O, MAI); 43133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner } else if (MAI->getSetDirective()) { 43233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getPrivateGlobalPrefix() << getFunctionNumber() 433b3ac6e40d9dd3bc8157edc47004f39c8f382dc9eChris Lattner << '_' << uid << "_set_" << MBB->getNumber(); 4349de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } else { 435325d3dcfe4d5efc91db0f59b20a72a11dea024edChris Lattner GetMBBSymbol(MBB->getNumber())->print(O, MAI); 436b3ac6e40d9dd3bc8157edc47004f39c8f382dc9eChris Lattner // If the arch uses custom Jump Table directives, don't calc relative to 437b3ac6e40d9dd3bc8157edc47004f39c8f382dc9eChris Lattner // JT 438b3ac6e40d9dd3bc8157edc47004f39c8f382dc9eChris Lattner if (!HadJTEntryDirective) 43933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" 440b3ac6e40d9dd3bc8157edc47004f39c8f382dc9eChris Lattner << getFunctionNumber() << '_' << uid; 4419de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4429de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov} 4439de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4449de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 445ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// EmitSpecialLLVMGlobal - Check to see if the specified global is a 446ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// special global used by LLVM. If so, emit it and return true, otherwise 447ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// do nothing and return false. 448ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattnerbool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { 44903d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar if (GV->getName() == "llvm.used") { 45033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getUsedDirective() != 0) // No need to emit this at all. 451b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth EmitLLVMUsedList(GV->getInitializer()); 452b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth return true; 453b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth } 454b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth 455401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // Ignore debug and non-emitted data. This handles llvm.compiler.used. 456266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner if (GV->getSection() == "llvm.metadata" || 457266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner GV->hasAvailableExternallyLinkage()) 458266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner return true; 4597809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey 4607809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey if (!GV->hasAppendingLinkage()) return false; 4617809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey 4627809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey assert(GV->hasInitializer() && "Not a special LLVM global!"); 463ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 464916d07cdfa89e77118043ec6e14575512ae1bf85Evan Cheng const TargetData *TD = TM.getTargetData(); 465916d07cdfa89e77118043ec6e14575512ae1bf85Evan Cheng unsigned Align = Log2_32(TD->getPointerPrefAlignment()); 466f231c07228deb75b6cd5ae7c9c057bc8303c6998Chris Lattner if (GV->getName() == "llvm.global_ctors") { 4676c2f9e14fdf14d8c1c687c6bd9918183fa7f8a7fChris Lattner OutStreamer.SwitchSection(getObjFileLowering().getStaticCtorSection()); 468ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitAlignment(Align, 0); 469ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitXXStructorList(GV->getInitializer()); 470ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner return true; 471ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 472ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 473f231c07228deb75b6cd5ae7c9c057bc8303c6998Chris Lattner if (GV->getName() == "llvm.global_dtors") { 4746c2f9e14fdf14d8c1c687c6bd9918183fa7f8a7fChris Lattner OutStreamer.SwitchSection(getObjFileLowering().getStaticDtorSection()); 475ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitAlignment(Align, 0); 476ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitXXStructorList(GV->getInitializer()); 477ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner return true; 478ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 479ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 480ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner return false; 481ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner} 482ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 48333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner/// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each 484d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen/// global in the specified llvm.used list for which emitUsedDirectiveFor 485d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen/// is true, as being used with this directive. 486cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattnervoid AsmPrinter::EmitLLVMUsedList(Constant *List) { 48733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner const char *Directive = MAI->getUsedDirective(); 488cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 489a119de86a064414622562cfe32953de7f9b0ee40Dan Gohman // Should be an array of 'i8*'. 490cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner ConstantArray *InitList = dyn_cast<ConstantArray>(List); 491cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner if (InitList == 0) return; 492cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 493cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 49416fe990e56102a355f1e77aca93bf8c79d7b9eb2Chris Lattner const GlobalValue *GV = 49516fe990e56102a355f1e77aca93bf8c79d7b9eb2Chris Lattner dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts()); 49626630c1180502d07c9b2b4a9a4ba06bc5ddf180bChris Lattner if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang)) { 49761e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen O << Directive; 49861e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen EmitConstantValueOnly(InitList->getOperand(i)); 49961e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen O << '\n'; 50061e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen } 501cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner } 502cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner} 503cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 504ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the 505ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// function pointers, ignoring the init priority. 506ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattnervoid AsmPrinter::EmitXXStructorList(Constant *List) { 507ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner // Should be an array of '{ int, void ()* }' structs. The first value is the 508ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner // init priority, which we ignore. 509ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (!isa<ConstantArray>(List)) return; 510ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner ConstantArray *InitList = cast<ConstantArray>(List); 511ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 512ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){ 513ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. 5148de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner 5158de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner if (CS->getOperand(1)->isNullValue()) 5168de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner return; // Found a null terminator, exit printing. 5178de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner // Emit the function pointer. 518ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner EmitGlobalConstant(CS->getOperand(1)); 519ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 520ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner} 5213b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner 522bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 523f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===----------------------------------------------------------------------===// 524f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// LEB 128 number encoding. 525f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 526c0ef244499a97ba4f411456fe5d65deb79d51ba7Bob Wilson/// PrintULEB128 - Print a series of hexadecimal values (separated by commas) 527f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// representing an unsigned leb128 value. 528f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintULEB128(unsigned Value) const { 529a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner char Buffer[20]; 530f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey do { 531a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 532f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey Value >>= 7; 533f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (Value) Byte |= 0x80; 534a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << "0x" << utohex_buffer(Byte, Buffer+20); 535f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (Value) O << ", "; 536f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } while (Value); 537f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 538f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 539c0ef244499a97ba4f411456fe5d65deb79d51ba7Bob Wilson/// PrintSLEB128 - Print a series of hexadecimal values (separated by commas) 540f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// representing a signed leb128 value. 541f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintSLEB128(int Value) const { 542f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey int Sign = Value >> (8 * sizeof(Value) - 1); 543f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey bool IsMore; 544a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner char Buffer[20]; 545ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov 546f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey do { 547a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 548f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey Value >>= 7; 549f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 550f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (IsMore) Byte |= 0x80; 551a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << "0x" << utohex_buffer(Byte, Buffer+20); 552f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (IsMore) O << ", "; 553f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } while (IsMore); 554f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 555f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 556f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===--------------------------------------------------------------------===// 557f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey// Emission and print routines 558f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey// 559f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 560c0ef244499a97ba4f411456fe5d65deb79d51ba7Bob Wilson/// PrintHex - Print a value as a hexadecimal value. 561f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 562f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintHex(int Value) const { 563c6a1346d7c6bb761f9e6c2c85b53febba1cb15dbChris Lattner char Buffer[20]; 564c6a1346d7c6bb761f9e6c2c85b53febba1cb15dbChris Lattner O << "0x" << utohex_buffer(static_cast<unsigned>(Value), Buffer+20); 565f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 566f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 567f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EOL - Print a newline character to asm stream. If a comment is present 568f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// then it will be printed first. Comments should not contain '\n'. 569bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskeyvoid AsmPrinter::EOL() const { 570d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 571bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey} 57225995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson 573f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EOL(const std::string &Comment) const { 5746547e406cf934346db7a206b61bcf09635afff0dEvan Cheng if (VerboseAsm && !Comment.empty()) { 57533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 57633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 577d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman << ' ' 578f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Comment; 579f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 580d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 581f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 582f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 58325995093e785f4794b3590f3df70fbfe834a00a1Owen Andersonvoid AsmPrinter::EOL(const char* Comment) const { 5846547e406cf934346db7a206b61bcf09635afff0dEvan Cheng if (VerboseAsm && *Comment) { 58533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 58633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 58725995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << ' ' 58825995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << Comment; 58925995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson } 59025995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson O << '\n'; 59125995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson} 592b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling 593b5abecded7573de0747f9f529a52561741bed0a2Bill Wendlingstatic const char *DecodeDWARFEncoding(unsigned Encoding) { 594b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling switch (Encoding) { 595b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_absptr: 596b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "absptr"; 597b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_omit: 598b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "omit"; 599b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_pcrel: 600b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "pcrel"; 6010734d35044c304dd072f20e49840bcbea427db9cBill Wendling case dwarf::DW_EH_PE_udata4: 6020734d35044c304dd072f20e49840bcbea427db9cBill Wendling return "udata4"; 6030734d35044c304dd072f20e49840bcbea427db9cBill Wendling case dwarf::DW_EH_PE_udata8: 6040734d35044c304dd072f20e49840bcbea427db9cBill Wendling return "udata8"; 6050734d35044c304dd072f20e49840bcbea427db9cBill Wendling case dwarf::DW_EH_PE_sdata4: 6060734d35044c304dd072f20e49840bcbea427db9cBill Wendling return "sdata4"; 6070734d35044c304dd072f20e49840bcbea427db9cBill Wendling case dwarf::DW_EH_PE_sdata8: 6080734d35044c304dd072f20e49840bcbea427db9cBill Wendling return "sdata8"; 609b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4: 610b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "pcrel udata4"; 611b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4: 612b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "pcrel sdata4"; 613b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8: 614b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "pcrel udata8"; 615b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8: 616b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "pcrel sdata8"; 617b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata4: 618b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "indirect pcrel udata4"; 619b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata4: 620b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "indirect pcrel sdata4"; 621b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata8: 622b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "indirect pcrel udata8"; 623b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata8: 624b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return "indirect pcrel sdata8"; 625b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling } 626b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling 627b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling return 0; 628b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling} 629b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling 630b5abecded7573de0747f9f529a52561741bed0a2Bill Wendlingvoid AsmPrinter::EOL(const char *Comment, unsigned Encoding) const { 631b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling if (VerboseAsm && *Comment) { 632b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling O.PadToColumn(MAI->getCommentColumn()); 633b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling O << MAI->getCommentString() 634b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling << ' ' 635b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling << Comment; 636b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling 637b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling if (const char *EncStr = DecodeDWARFEncoding(Encoding)) 638b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling O << " (" << EncStr << ')'; 639b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling } 640b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling O << '\n'; 641b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling} 64225995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson 643f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 644f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// unsigned leb128 value. 645f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitULEB128Bytes(unsigned Value) const { 64633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->hasLEB128()) { 647f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\t.uleb128\t" 648f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Value; 649f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 65033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData8bitsDirective(); 651f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintULEB128(Value); 652f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 653f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 654f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 655f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitSLEB128Bytes - print an assembler byte data directive to compose a 656f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// signed leb128 value. 657f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitSLEB128Bytes(int Value) const { 65833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->hasLEB128()) { 659f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\t.sleb128\t" 660f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Value; 661f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 66233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData8bitsDirective(); 663f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintSLEB128(Value); 664f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 665f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 666f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 667f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt8 - Emit a byte directive and value. 668f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 669f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt8(int Value) const { 67033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData8bitsDirective(); 671f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value & 0xFF); 672f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 673f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 674f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt16 - Emit a short directive and value. 675f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 676f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt16(int Value) const { 67733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(); 678f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value & 0xFFFF); 679f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 680f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 681f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt32 - Emit a long directive and value. 682f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 683f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt32(int Value) const { 68433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(); 685f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value); 686f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 687f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 688f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt64 - Emit a long long directive and value. 689f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 690f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt64(uint64_t Value) const { 69133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getData64bitsDirective()) { 69233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData64bitsDirective(); 693f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value); 694f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 695f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TM.getTargetData()->isBigEndian()) { 696d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman EmitInt32(unsigned(Value >> 32)); O << '\n'; 697f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey EmitInt32(unsigned(Value)); 698f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 699d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman EmitInt32(unsigned(Value)); O << '\n'; 700f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey EmitInt32(unsigned(Value >> 32)); 701f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 702f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 703f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 704f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 705f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// toOctal - Convert the low order bits of X into an octal digit. 706f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 707f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeystatic inline char toOctal(int X) { 708f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey return (X&7)+'0'; 709f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 710f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 711f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// printStringChar - Print a char, escaped if necessary. 712f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 71371847813bc419f7a0667468136a07429c6d9f164David Greenestatic void printStringChar(formatted_raw_ostream &O, unsigned char C) { 714f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (C == '"') { 715f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\\\""; 716f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else if (C == '\\') { 717f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\\\\"; 718bbfa244b2fa986c53a1bcf38b6dd0fea082afaaaChris Lattner } else if (isprint((unsigned char)C)) { 719f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << C; 720f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 721f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey switch(C) { 722f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\b': O << "\\b"; break; 723f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\f': O << "\\f"; break; 724f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\n': O << "\\n"; break; 725f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\r': O << "\\r"; break; 726f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\t': O << "\\t"; break; 727f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey default: 728f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << '\\'; 729f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 6); 730f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 3); 731f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 0); 732f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey break; 733f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 734f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 735f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 736f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 737f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitString - Emit a string with quotes and a null terminator. 738f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// Special characters are emitted properly. 739f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// \literal (Eg. '\t') \endliteral 740e9a059714e3dccd6c870f19c3839f3352ac823edDevang Patelvoid AsmPrinter::EmitString(const StringRef String) const { 74124f8e29b4efe70496474c6d43aa6abfa27c21511Dan Gohman EmitString(String.data(), String.size()); 742f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling} 743f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling 744f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendlingvoid AsmPrinter::EmitString(const char *String, unsigned Size) const { 74533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner const char* AscizDirective = MAI->getAscizDirective(); 746fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov if (AscizDirective) 747fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << AscizDirective; 748fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov else 74933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getAsciiDirective(); 750d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 751f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling for (unsigned i = 0; i < Size; ++i) 752a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner printStringChar(O, String[i]); 753fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov if (AscizDirective) 754d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 755fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov else 756fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << "\\0\""; 757f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 758f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 759f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 760189f80dc253664627253b2d2cb07d0714feb12baDan Gohman/// EmitFile - Emit a .file directive. 761189f80dc253664627253b2d2cb07d0714feb12baDan Gohmanvoid AsmPrinter::EmitFile(unsigned Number, const std::string &Name) const { 762189f80dc253664627253b2d2cb07d0714feb12baDan Gohman O << "\t.file\t" << Number << " \""; 763a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner for (unsigned i = 0, N = Name.size(); i < N; ++i) 764a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner printStringChar(O, Name[i]); 765d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 766189f80dc253664627253b2d2cb07d0714feb12baDan Gohman} 767189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 768189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 769f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===----------------------------------------------------------------------===// 770f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 7713a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// EmitAlignment - Emit an alignment directive to the specified power of 7723a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// two boundary. For example, if you pass in 3 here, you will get an 8 7733a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// byte alignment. If a global value is specified, and if that global has 7743a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// an explicit alignment requested, it will unconditionally override the 7753a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// alignment request. However, if ForcedAlignBits is specified, this value 7763a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// has final say: the ultimate alignment will be the max of ForcedAlignBits 7773a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// and the alignment computed with NumBits and the global. 7783a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// 7793a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// The algorithm is: 7803a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// Align = NumBits; 7813a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// if (GV && GV->hasalignment) Align = GV->getalignment(); 7823a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// Align = std::max(Align, ForcedAlignBits); 7833a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// 7843a4205367dc845d4cd804b47e061f8281777c9daChris Lattnervoid AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, 78505548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits, 78605548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr) const { 78700d56b96e599acbc4f895e86e17029ae7c45f142Dale Johannesen if (GV && GV->getAlignment()) 7883a4205367dc845d4cd804b47e061f8281777c9daChris Lattner NumBits = Log2_32(GV->getAlignment()); 7893a4205367dc845d4cd804b47e061f8281777c9daChris Lattner NumBits = std::max(NumBits, ForcedAlignBits); 7903a4205367dc845d4cd804b47e061f8281777c9daChris Lattner 7912a21c6e86101c857d683e7bdefb775654ccab7e3Chris Lattner if (NumBits == 0) return; // No need to emit alignment. 792663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner 793663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner unsigned FillValue = 0; 794dabf07c70a5e13a4560d75667fa5c7db28921a92Chris Lattner if (getCurrentSection()->getKind().isText()) 79533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner FillValue = MAI->getTextAlignFillValue(); 796663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner 797663c2d2580e6e9b2435785c7e5a2de18758860a3Chris Lattner OutStreamer.EmitValueToAlignment(1 << NumBits, FillValue, 1, 0); 798bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner} 799a5bb59f85613e8ce481351803e7388f5ab466e72David Greene 80025045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner/// EmitZeros - Emit a block of zeros. 8017d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner/// 802c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitZeros(uint64_t NumZeros, unsigned AddrSpace) const { 8037d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner if (NumZeros) { 80433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getZeroDirective()) { 80533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getZeroDirective() << NumZeros; 80633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getZeroDirectiveSuffix()) 80733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getZeroDirectiveSuffix(); 808d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 809c6a057b04db506152c98355b51ba15d82a15b90aJeff Cohen } else { 8107d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner for (; NumZeros; --NumZeros) 81133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData8bitsDirective(AddrSpace) << "0\n"; 8127d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner } 8137d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner } 8147d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner} 8157d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner 816a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// Print out the specified constant, without a storage class. Only the 817a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// constants valid in constant expressions can occur here. 81825045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattnervoid AsmPrinter::EmitConstantValueOnly(const Constant *CV) { 819fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (CV->isNullValue() || isa<UndefValue>(CV)) { 820d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '0'; 821fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return; 822fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 823fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 824fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 8254315eee376450972d111c8e263ca8aecc7a3a13bScott Michel O << CI->getZExtValue(); 826fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return; 827fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 828fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 829fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) { 830855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // This is a constant address for a global variable or function. Use the 831bfd1e50c4f51e5f22ba68f28172b0ed9ab66a61aChris Lattner // name of the variable or function as the address value. 832bfd1e50c4f51e5f22ba68f28172b0ed9ab66a61aChris Lattner O << Mang->getMangledName(GV); 833fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return; 834fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 835fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 836fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV)) { 837fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner GetBlockAddressSymbol(BA)->print(O, MAI); 838fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return; 839fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 840fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 841fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV); 842fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (CE == 0) { 843fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner llvm_unreachable("Unknown constant value!"); 844fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << '0'; 845fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return; 846fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 847fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 848fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner switch (CE->getOpcode()) { 849fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::ZExt: 850fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::SExt: 851fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::FPTrunc: 852fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::FPExt: 853fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::UIToFP: 854fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::SIToFP: 855fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::FPToUI: 856fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::FPToSI: 857fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner default: 858fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner llvm_unreachable("FIXME: Don't support this constant cast expr"); 859fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::GetElementPtr: { 860fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // generate a symbolic expression for the byte address 861a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson const TargetData *TD = TM.getTargetData(); 862fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner const Constant *ptrVal = CE->getOperand(0); 863fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end()); 864fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner int64_t Offset = TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], 865fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner idxVec.size()); 866fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (Offset == 0) 867fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return EmitConstantValueOnly(ptrVal); 868fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 869fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // Truncate/sext the offset to the pointer size. 870fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (TD->getPointerSizeInBits() != 64) { 871fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner int SExtAmount = 64-TD->getPointerSizeInBits(); 872fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner Offset = (Offset << SExtAmount) >> SExtAmount; 873a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 874fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 875fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (Offset) 876fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << '('; 877fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner EmitConstantValueOnly(ptrVal); 878fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (Offset > 0) 879fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << ") + " << Offset; 880fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner else 881fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << ") - " << -Offset; 882fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return; 883fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 884fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::BitCast: 885fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return EmitConstantValueOnly(CE->getOperand(0)); 886fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 887fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::IntToPtr: { 888fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // Handle casts to pointers by changing them into casts to the appropriate 889fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // integer type. This promotes constant folding and simplifies this code. 890fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner const TargetData *TD = TM.getTargetData(); 891fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner Constant *Op = CE->getOperand(0); 892fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner Op = ConstantExpr::getIntegerCast(Op, TD->getIntPtrType(CV->getContext()), 893fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner false/*ZExt*/); 894fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return EmitConstantValueOnly(Op); 895fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 896fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 897fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::PtrToInt: { 898fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // Support only foldable casts to/from pointers that can be eliminated by 899fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // changing the pointer to the appropriately sized integer type. 900fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner Constant *Op = CE->getOperand(0); 901fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner const Type *Ty = CE->getType(); 902fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner const TargetData *TD = TM.getTargetData(); 903fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 904fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // We can emit the pointer value into this slot if the slot is an 905fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // integer slot greater or equal to the size of the pointer. 906fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner if (TD->getTypeAllocSize(Ty) == TD->getTypeAllocSize(Op->getType())) 907ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner return EmitConstantValueOnly(Op); 908fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 909fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << "(("; 910fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner EmitConstantValueOnly(Op); 911fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner APInt ptrMask = 912fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner APInt::getAllOnesValue(TD->getTypeAllocSizeInBits(Op->getType())); 913fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner 914fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner SmallString<40> S; 915fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner ptrMask.toStringUnsigned(S); 916fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << ") & " << S.str() << ')'; 917fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return; 918fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner } 919ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner 920fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::Trunc: 921fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // We emit the value and depend on the assembler to truncate the generated 922fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // expression properly. This is important for differences between 923fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // blockaddress labels. Since the two labels are in the same function, it 924fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner // is reasonable to treat their delta as a 32-bit value. 925fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner return EmitConstantValueOnly(CE->getOperand(0)); 926fad86b003a839cef40ec8ce8408322f4913368caChris Lattner 927fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::Add: 928fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::Sub: 929fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::And: 930fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::Or: 931fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner case Instruction::Xor: 932fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << '('; 933fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner EmitConstantValueOnly(CE->getOperand(0)); 934fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << ')'; 935fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner switch (CE->getOpcode()) { 936a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner case Instruction::Add: 937fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << " + "; 938fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner break; 93913b7d3d499ec63c5f417f7a7246afb77adb63b2eAnton Korobeynikov case Instruction::Sub: 940fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << " - "; 941fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner break; 942feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::And: 943fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << " & "; 944fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner break; 945feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Or: 946fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << " | "; 947fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner break; 948feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Xor: 949fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << " ^ "; 950fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner break; 951a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner default: 952fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner break; 953a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 954fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << '('; 955fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner EmitConstantValueOnly(CE->getOperand(1)); 956fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner O << ')'; 957fe0e7ed6b077360dbcc6d9f0bc0a4dfeb77c8e9bChris Lattner break; 958a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 959a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 9601b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 9612980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner/// printAsCString - Print the specified array as a C compatible string, only if 9621b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner/// the predicate isString is true. 9631b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner/// 96471847813bc419f7a0667468136a07429c6d9f164David Greenestatic void printAsCString(formatted_raw_ostream &O, const ConstantArray *CVA, 9652980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner unsigned LastElt) { 9661b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner assert(CVA->isString() && "Array is not string compatible!"); 9671b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 968d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 9692980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner for (unsigned i = 0; i != LastElt; ++i) { 970edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman unsigned char C = 971b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer (unsigned char)cast<ConstantInt>(CVA->getOperand(i))->getZExtValue(); 972f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey printStringChar(O, C); 9731b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 974d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 9751b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner} 9761b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 977c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen/// EmitString - Emit a zero-byte-terminated string constant. 978c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen/// 979c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohenvoid AsmPrinter::EmitString(const ConstantArray *CVA) const { 980c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen unsigned NumElts = CVA->getNumOperands(); 98133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getAscizDirective() && NumElts && 982b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer cast<ConstantInt>(CVA->getOperand(NumElts-1))->getZExtValue() == 0) { 98333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getAscizDirective(); 984c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen printAsCString(O, CVA, NumElts-1); 985c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen } else { 98633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getAsciiDirective(); 987c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen printAsCString(O, CVA, NumElts); 988c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen } 989d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 990c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen} 991c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 992d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantArray(const ConstantArray *CVA, 993d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta unsigned AddrSpace) { 99400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (CVA->isString()) { 99500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitString(CVA); 99600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { // Not a string. Print the values in successive locations 99700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i) 998d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta EmitGlobalConstant(CVA->getOperand(i), AddrSpace); 99900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 100000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 100100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 100200d448a341175556ebd86af68219f5b90b7145a3Dan Gohmanvoid AsmPrinter::EmitGlobalConstantVector(const ConstantVector *CP) { 100300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const VectorType *PTy = CP->getType(); 100400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 100500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned I = 0, E = PTy->getNumElements(); I < E; ++I) 100600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitGlobalConstant(CP->getOperand(I)); 100700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 100800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1009c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantStruct(const ConstantStruct *CVS, 1010c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 101100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Print the fields in successive locations. Pad to align if needed! 101200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 1013777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands unsigned Size = TD->getTypeAllocSize(CVS->getType()); 101400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const StructLayout *cvsLayout = TD->getStructLayout(CVS->getType()); 101500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t sizeSoFar = 0; 101600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = CVS->getNumOperands(); i != e; ++i) { 101700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const Constant* field = CVS->getOperand(i); 101800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 101900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Check if padding is needed and insert one or more 0s. 1020777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands uint64_t fieldSize = TD->getTypeAllocSize(field->getType()); 102100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t padSize = ((i == e-1 ? Size : cvsLayout->getElementOffset(i+1)) 102200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman - cvsLayout->getElementOffset(i)) - fieldSize; 102300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman sizeSoFar += fieldSize + padSize; 102400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 102500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Now print the actual field value. 1026c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstant(field, AddrSpace); 102700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 102800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Insert padding - this may include padding to increase the size of the 102900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // current field up to the ABI size (if the struct is not packed) as well 103000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // as padding to ensure that the next field starts at the right offset. 1031c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitZeros(padSize, AddrSpace); 103200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 103300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman assert(sizeSoFar == cvsLayout->getSizeInBytes() && 103400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman "Layout of constant struct may be incorrect!"); 103500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 103600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1037c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP, 1038c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 103900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // FP Constants are printed as integer constants to avoid losing 104000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // precision... 10411d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson LLVMContext &Context = CFP->getContext(); 104200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 1043cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner if (CFP->getType()->isDoubleTy()) { 104400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman double Val = CFP->getValueAPF().convertToDouble(); // for comment only 104500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 104633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (MAI->getData64bitsDirective(AddrSpace)) { 104733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData64bitsDirective(AddrSpace) << i; 1048a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 104933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 105033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " double " << Val; 1051a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1052f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1053f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng } else if (TD->isBigEndian()) { 105433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1055a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 105633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 105733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1058cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " most significant word of double " << Val; 1059a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1060f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 106133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1062a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 106333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 106433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1065cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " least significant word of double " << Val; 1066a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1067f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 106800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 106933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1070a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 107133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 107233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1073cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " least significant word of double " << Val; 1074a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1075f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 107633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1077a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 107833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 107933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1080cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " most significant word of double " << Val; 1081a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1082f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 108300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 108400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 1085cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner } 1086cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner 1087cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner if (CFP->getType()->isFloatTy()) { 108800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman float Val = CFP->getValueAPF().convertToFloat(); // for comment only 108933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) 1090f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1091a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 109233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 109333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " float " << Val; 1094a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1095f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 109600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 1097cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner } 1098cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner 1099cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner if (CFP->getType()->isX86_FP80Ty()) { 110000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // all long double variants are printed as hex 110100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // api needed to prevent premature destruction 110200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman APInt api = CFP->getValueAPF().bitcastToAPInt(); 110300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *p = api.getRawData(); 110400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Convert to double so we can print the approximate val as a comment. 110500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman APFloat DoubleVal = CFP->getValueAPF(); 110600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman bool ignored; 110700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, 110800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman &ignored); 110900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) { 111033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1111a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 111233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 111333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1114cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " most significant halfword of x86_fp80 ~" 1115f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << DoubleVal.convertToDouble(); 1116a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1117f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 111833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1119a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 112033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 112133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " next halfword"; 1122a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1123f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 112433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1125a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 112633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 112733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " next halfword"; 1128a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1129f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 113033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1131a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 113233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 113333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " next halfword"; 1134a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1135f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 113633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1137a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 113833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 113933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1140cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " least significant halfword"; 1141a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1142f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 114300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 114433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1145a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 114633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 114733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1148cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " least significant halfword of x86_fp80 ~" 1149f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << DoubleVal.convertToDouble(); 1150a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1151f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 115233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1153a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 115433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 115533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1156cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " next halfword"; 1157a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1158f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 115933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1160a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 116133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 116233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1163cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " next halfword"; 1164a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1165f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 116633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1167a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 116833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 116933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1170cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " next halfword"; 1171a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1172f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 117333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1174a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 117533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 117633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1177cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " most significant halfword"; 1178a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1179f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 118000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 11811d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson EmitZeros(TD->getTypeAllocSize(Type::getX86_FP80Ty(Context)) - 11821d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson TD->getTypeStoreSize(Type::getX86_FP80Ty(Context)), AddrSpace); 118300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 1184cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner } 1185cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner 1186cf0fe8d813727383d630055bb9d1cde21b00b7e7Chris Lattner if (CFP->getType()->isPPC_FP128Ty()) { 118700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // all long double variants are printed as hex 118800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // api needed to prevent premature destruction 118900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman APInt api = CFP->getValueAPF().bitcastToAPInt(); 119000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *p = api.getRawData(); 119100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) { 119233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1193a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 119433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 119533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1196cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " most significant word of ppc_fp128"; 1197a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1198f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 119933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1200a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 120133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 120233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1203cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " next word"; 1204a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1205f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 120633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1207a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 120833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 120933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1210cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " next word"; 1211a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1212f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 121333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1214a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 121533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 121633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1217cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " least significant word"; 1218a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1219f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 122000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 122133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1222a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 122333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 122433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1225cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " least significant word of ppc_fp128"; 1226a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1227f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 122833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1229a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 123033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 123133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1232cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " next word"; 1233a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1234f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 123533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1236a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 123733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 123833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1239cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " next word"; 1240a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1241f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 124233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1243a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman if (VerboseAsm) { 124433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 124533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() 1246cf20ac4fd12ea3510a8f32a24fff69eebe7b6f4aDan Gohman << " most significant word"; 1247a12e9d751b64767a5c41a718da2a91122d5874c4Dan Gohman } 1248f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 124900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 125000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 1251c23197a26f34f559ea9797de51e187087c039c42Torok Edwin } else llvm_unreachable("Floating point constant type not handled"); 125200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 125300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1254c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI, 1255c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 125600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 125700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman unsigned BitWidth = CI->getBitWidth(); 125838c2b0a99c6a3f5cdf6ef5a46e4a6826b30acbfbChris Lattner assert((BitWidth & 63) == 0 && "only support multiples of 64-bits"); 125900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 126000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // We don't expect assemblers to support integer data directives 126100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // for more than 64 bits, so we emit the data in at most 64-bit 126200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // quantities at a time. 126300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *RawData = CI->getValue().getRawData(); 126400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) { 126500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t Val; 126600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) 126700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman Val = RawData[e - i - 1]; 126800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman else 126900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman Val = RawData[i]; 127000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 12715979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner if (MAI->getData64bitsDirective(AddrSpace)) { 127233adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData64bitsDirective(AddrSpace) << Val << '\n'; 12735979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner continue; 127400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 12755979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner 12765979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner // Emit two 32-bit chunks, order depends on endianness. 12775979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner unsigned FirstChunk = unsigned(Val), SecondChunk = unsigned(Val >> 32); 12785979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner const char *FirstName = " least", *SecondName = " most"; 12795979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner if (TD->isBigEndian()) { 12805979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner std::swap(FirstChunk, SecondChunk); 12815979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner std::swap(FirstName, SecondName); 12825979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner } 12835979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner 12845979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << FirstChunk; 12855979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner if (VerboseAsm) { 12865979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 12875979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O << MAI->getCommentString() 12885979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner << FirstName << " significant half of i64 " << Val; 12895979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner } 12905979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O << '\n'; 12915979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner 12925979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O << MAI->getData32bitsDirective(AddrSpace) << SecondChunk; 12935979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner if (VerboseAsm) { 12945979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 12955979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O << MAI->getCommentString() 12965979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner << SecondName << " significant half of i64 " << Val; 12975979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner } 12985979dfff8ea73c9d728d3a586efba6581be3e672Chris Lattner O << '\n'; 129900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 130000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 130100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 130225045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner/// EmitGlobalConstant - Print a general LLVM constant to the .s file. 1303c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { 1304a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson const TargetData *TD = TM.getTargetData(); 130500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const Type *type = CV->getType(); 1306777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands unsigned Size = TD->getTypeAllocSize(type); 13071b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 1308bd1d382cc47dfc43ee758714bc22ab5a750bad15Chris Lattner if (CV->isNullValue() || isa<UndefValue>(CV)) { 1309c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitZeros(Size, AddrSpace); 13101b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 13113cc3a00570e8263369346cf2eef9a72488326952Chris Lattner } 13123cc3a00570e8263369346cf2eef9a72488326952Chris Lattner 13133cc3a00570e8263369346cf2eef9a72488326952Chris Lattner if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) { 1314d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta EmitGlobalConstantArray(CVA , AddrSpace); 13151b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 13163cc3a00570e8263369346cf2eef9a72488326952Chris Lattner } 13173cc3a00570e8263369346cf2eef9a72488326952Chris Lattner 13183cc3a00570e8263369346cf2eef9a72488326952Chris Lattner if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) { 1319c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantStruct(CVS, AddrSpace); 13201b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 13213cc3a00570e8263369346cf2eef9a72488326952Chris Lattner } 13223cc3a00570e8263369346cf2eef9a72488326952Chris Lattner 13233cc3a00570e8263369346cf2eef9a72488326952Chris Lattner if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) { 1324c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantFP(CFP, AddrSpace); 132500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 13263cc3a00570e8263369346cf2eef9a72488326952Chris Lattner } 13273cc3a00570e8263369346cf2eef9a72488326952Chris Lattner 13283cc3a00570e8263369346cf2eef9a72488326952Chris Lattner if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 13293cc3a00570e8263369346cf2eef9a72488326952Chris Lattner // If we can directly emit an 8-byte constant, do it. 13303cc3a00570e8263369346cf2eef9a72488326952Chris Lattner if (Size == 8) 13313cc3a00570e8263369346cf2eef9a72488326952Chris Lattner if (const char *Data64Dir = MAI->getData64bitsDirective(AddrSpace)) { 13323cc3a00570e8263369346cf2eef9a72488326952Chris Lattner O << Data64Dir << CI->getZExtValue() << '\n'; 13333cc3a00570e8263369346cf2eef9a72488326952Chris Lattner return; 13343cc3a00570e8263369346cf2eef9a72488326952Chris Lattner } 13353cc3a00570e8263369346cf2eef9a72488326952Chris Lattner 133600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Small integers are handled below; large integers are handled here. 133700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (Size > 4) { 1338c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantLargeInt(CI, AddrSpace); 13391b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 13401b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 13413cc3a00570e8263369346cf2eef9a72488326952Chris Lattner } 13423cc3a00570e8263369346cf2eef9a72488326952Chris Lattner 13433cc3a00570e8263369346cf2eef9a72488326952Chris Lattner if (const ConstantVector *CP = dyn_cast<ConstantVector>(CV)) { 134400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitGlobalConstantVector(CP); 13458cfa57b1b4eade4e0101195b2f94ab288cd03563Nate Begeman return; 13461b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 13471b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 1348c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta printDataDirective(type, AddrSpace); 134925045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(CV); 1350f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) { 1351f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1352f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng SmallString<40> S; 1353f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng CI->getValue().toStringUnsigned(S, 16); 135433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 135533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " 0x" << S.str(); 1356f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng } 1357eefc845b5f407adf1992602aaac1142b2d583220Scott Michel } 1358d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 13591b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner} 13600264d1a4777370009176157b76d116b3195e3767Chris Lattner 1361fad86b003a839cef40ec8ce8408322f4913368caChris Lattnervoid AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1362d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng // Target doesn't support this yet! 1363c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Target does not support EmitMachineConstantPoolValue"); 1364d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 1365d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 13663ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// PrintSpecial - Print information related to the specified machine instr 13673ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// that is independent of the operand, and may be independent of the instr 13683ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// itself. This can be useful for portably encoding the comment character 13693ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// or other bits of target-specific knowledge into the asmstrings. The 13703ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// syntax used is ${:comment}. Targets can override this to add support 13713ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// for their own strange codes. 13723e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattnervoid AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const { 1373bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner if (!strcmp(Code, "private")) { 137433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getPrivateGlobalPrefix(); 1375bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner } else if (!strcmp(Code, "comment")) { 1376f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 137733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString(); 13783ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } else if (!strcmp(Code, "uid")) { 1379b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner // Comparing the address of MI isn't sufficient, because machineinstrs may 1380b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner // be allocated to the same address across functions. 1381b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner const Function *ThisF = MI->getParent()->getParent()->getFunction(); 1382b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner 1383bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson // If this is a new LastFn instruction, bump the counter. 1384bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson if (LastMI != MI || LastFn != ThisF) { 1385b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner ++Counter; 1386b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner LastMI = MI; 1387bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson LastFn = ThisF; 1388b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner } 13893ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner O << Counter; 13903ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } else { 13917d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin std::string msg; 13927d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin raw_string_ostream Msg(msg); 13937d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin Msg << "Unknown special formatter '" << Code 1394e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling << "' for machine instr: " << *MI; 13957d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error(Msg.str()); 13963ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } 13973ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner} 13983ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1399cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis/// processDebugLoc - Processes the debug information of each machine 1400cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis/// instruction's DebugLoc. 1401af0e2726835e096e32c30c1b88cc7a6232a6ef69Devang Patelvoid AsmPrinter::processDebugLoc(const MachineInstr *MI, 1402af0e2726835e096e32c30c1b88cc7a6232a6ef69Devang Patel bool BeforePrintingInsn) { 140353bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel if (!MAI || !DW || !MAI->doesSupportDebugInformation() 140453bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel || !DW->ShouldEmitDwarfDebug()) 1405d250329291dd9fe0d5f0e72e6cf1e287558a7cbaChris Lattner return; 1406b0fdedb3fd123a47e7deca75d1e6f7d64218b07aDevang Patel DebugLoc DL = MI->getDebugLoc(); 140753bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel if (DL.isUnknown()) 140853bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel return; 140953bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel DebugLocTuple CurDLT = MF->getDebugLocTuple(DL); 141053bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel if (CurDLT.Scope == 0) 141153bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel return; 141253bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 141353bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel if (BeforePrintingInsn) { 141453bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel if (CurDLT != PrevDLT) { 141553bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel unsigned L = DW->RecordSourceLine(CurDLT.Line, CurDLT.Col, 141653bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel CurDLT.Scope); 141753bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel printLabel(L); 1418eecb9919a41dc11e805370d66cb2e43d8ef2649eDan Gohman O << '\n'; 141953bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel DW->BeginScope(MI, L); 1420cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis PrevDLT = CurDLT; 1421cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis } 142253bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel } else { 142353bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel // After printing instruction 142453bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel DW->EndScope(MI); 1425cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis } 1426cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis} 14273ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 142853bb5c95afe4ff2627cac513221af2e4e7c5d2e3Devang Patel 14290264d1a4777370009176157b76d116b3195e3767Chris Lattner/// printInlineAsm - This method formats and prints the specified machine 14300264d1a4777370009176157b76d116b3195e3767Chris Lattner/// instruction that is an inline asm. 14310264d1a4777370009176157b76d116b3195e3767Chris Lattnervoid AsmPrinter::printInlineAsm(const MachineInstr *MI) const { 1432f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner unsigned NumOperands = MI->getNumOperands(); 1433f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner 1434f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner // Count the number of register definitions. 1435f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner unsigned NumDefs = 0; 1436d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef(); 143767942f5dc30be1810f983aba8c94c49ca44e8634Chris Lattner ++NumDefs) 1438f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner assert(NumDefs != NumOperands-1 && "No asm string?"); 1439f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner 1440d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(MI->getOperand(NumDefs).isSymbol() && "No asm string?"); 14416609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 14426609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Disassemble the AsmStr, printing out the literal pieces, the operands, etc. 1443f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner const char *AsmStr = MI->getOperand(NumDefs).getSymbolName(); 14446609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 144540c57860dad429d3c938ed5f918c2c66f3b5fa72Dan Gohman O << '\t'; 144640c57860dad429d3c938ed5f918c2c66f3b5fa72Dan Gohman 1447ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen // If this asmstr is empty, just print the #APP/#NOAPP markers. 1448ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen // These are useful to see where empty asm's wound up. 1449f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner if (AsmStr[0] == 0) { 145033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << MAI->getInlineAsmStart() << "\n\t"; 145133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << MAI->getInlineAsmEnd() << '\n'; 1452f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner return; 1453f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner } 1454f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner 145533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << MAI->getInlineAsmStart() << "\n\t"; 1456f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner 1457eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling // The variant of the current asmprinter. 145833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner int AsmPrinterVariant = MAI->getAssemblerDialect(); 1459eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling 14606609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner int CurVariant = -1; // The number of the {.|.|.} region we are in. 14616609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *LastEmitted = AsmStr; // One past the last character emitted. 14622cc2f66c25d9576743026688fdae5ed402726532Chris Lattner 14636609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner while (*LastEmitted) { 14646609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner switch (*LastEmitted) { 14656609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner default: { 14666609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Not a special case, emit the string section literally. 14676609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *LiteralEnd = LastEmitted+1; 14686609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner while (*LiteralEnd && *LiteralEnd != '{' && *LiteralEnd != '|' && 14691c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner *LiteralEnd != '}' && *LiteralEnd != '$' && *LiteralEnd != '\n') 14706609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LiteralEnd; 14716609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 14726609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner O.write(LastEmitted, LiteralEnd-LastEmitted); 14736609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner LastEmitted = LiteralEnd; 14746609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 14756609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14761c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner case '\n': 14771c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner ++LastEmitted; // Consume newline character. 1478d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; // Indent code with newline. 14791c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner break; 14806609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner case '$': { 14816609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '$' character. 1482faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner bool Done = true; 1483faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner 1484faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner // Handle escapes. 1485faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner switch (*LastEmitted) { 1486faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner default: Done = false; break; 1487faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '$': // $$ -> $ 14886609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 14896609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner O << '$'; 14906609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume second '$' character. 14916609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 1492faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '(': // $( -> same as GCC's { character. 1493faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // Consume '(' character. 1494faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner if (CurVariant != -1) { 14957d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Nested variants found in inline asm string: '" 14967d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 1497faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner } 1498faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner CurVariant = 0; // We're in the first variant now. 1499faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 1500faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '|': 1501faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // consume '|' character. 15028b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen if (CurVariant == -1) 15038b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen O << '|'; // this is gcc's behavior for | outside a variant 15048b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen else 15058b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen ++CurVariant; // We're in the next variant. 1506faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 1507faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case ')': // $) -> same as GCC's } char. 1508faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // consume ')' character. 15098b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen if (CurVariant == -1) 15108b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen O << '}'; // this is gcc's behavior for } outside a variant 15118b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen else 15128b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen CurVariant = -1; 1513faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 15146609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1515faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner if (Done) break; 15166609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 15176609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner bool HasCurlyBraces = false; 15186609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (*LastEmitted == '{') { // ${variable} 15196609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '{' character. 15206609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner HasCurlyBraces = true; 15216609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15226609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 15233e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // If we have ${:foo}, then this is not a real operand reference, it is a 15243e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // "magic" string reference, just like in .td files. Arrange to call 15253e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // PrintSpecial. 15263e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner if (HasCurlyBraces && *LastEmitted == ':') { 15273e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner ++LastEmitted; 15283e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner const char *StrStart = LastEmitted; 15293e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner const char *StrEnd = strchr(StrStart, '}'); 15303e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner if (StrEnd == 0) { 15317d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Unterminated ${:foo} operand in inline asm string: '" 15327d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 15333e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner } 15343e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner 15353e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner std::string Val(StrStart, StrEnd); 15363e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner PrintSpecial(MI, Val.c_str()); 15373e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner LastEmitted = StrEnd+1; 15383e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner break; 15393e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner } 15403e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner 15416609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *IDStart = LastEmitted; 15426609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner char *IDEnd; 1543fad2912522a4c97128d8afcc2f40ca0e39287ddbChris Lattner errno = 0; 15446609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner long Val = strtol(IDStart, &IDEnd, 10); // We only accept numbers for IDs. 15456609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (!isdigit(*IDStart) || (Val == 0 && errno == EINVAL)) { 15467d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad $ operand number in inline asm string: '" 15477d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 15486609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15496609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner LastEmitted = IDEnd; 15506609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1551a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner char Modifier[2] = { 0, 0 }; 1552a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 15536609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (HasCurlyBraces) { 1554a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner // If we have curly braces, check for a modifier character. This 1555a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner // supports syntax like ${0:u}, which correspond to "%u0" in GCC asm. 1556a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner if (*LastEmitted == ':') { 1557a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner ++LastEmitted; // Consume ':' character. 1558a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner if (*LastEmitted == 0) { 15597d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad ${:} expression in inline asm string: '" 15607d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 1561a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner } 1562a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 1563a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner Modifier[0] = *LastEmitted; 1564a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner ++LastEmitted; // Consume modifier character. 1565a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner } 1566a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 15676609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (*LastEmitted != '}') { 15687d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad ${} expression in inline asm string: '" 15697d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 15706609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15716609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '}' character. 15726609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15736609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 15746609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if ((unsigned)Val >= NumOperands-1) { 15757d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Invalid $ operand number in inline asm string: '" 15767d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 15776609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15786609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1579c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner // Okay, we finally have a value number. Ask the target to print this 15806609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // operand! 1581c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) { 1582c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner unsigned OpNo = 1; 1583fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1584fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner bool Error = false; 1585fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1586c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner // Scan to find the machine operand number for the operand. 1587daf6bc6347b4785102611bdf21c512e8a7678cceChris Lattner for (; Val; --Val) { 1588fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner if (OpNo >= MI->getNumOperands()) break; 15899e3304900ff69c4920fea7369c9c36916c4a6a6aChris Lattner unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1590697cbbfb00c318f98d6eb51945f077e2bfe8781eEvan Cheng OpNo += InlineAsm::getNumOperandRegisters(OpFlags) + 1; 1591daf6bc6347b4785102611bdf21c512e8a7678cceChris Lattner } 1592fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1593fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner if (OpNo >= MI->getNumOperands()) { 1594fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner Error = true; 1595dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner } else { 15969e3304900ff69c4920fea7369c9c36916c4a6a6aChris Lattner unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1597fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner ++OpNo; // Skip over the ID number. 1598fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1599eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen if (Modifier[0]=='l') // labels are target independent 1600325d3dcfe4d5efc91db0f59b20a72a11dea024edChris Lattner GetMBBSymbol(MI->getOperand(OpNo).getMBB() 1601325d3dcfe4d5efc91db0f59b20a72a11dea024edChris Lattner ->getNumber())->print(O, MAI); 1602eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen else { 1603eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen AsmPrinter *AP = const_cast<AsmPrinter*>(this); 160486b49f8e2de796cb46c7c8b6a4c4900533fd53f4Dale Johannesen if ((OpFlags & 7) == 4) { 1605eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, 1606eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Modifier[0] ? Modifier : 0); 1607eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen } else { 1608eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, 1609eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Modifier[0] ? Modifier : 0); 1610eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen } 1611fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner } 1612dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner } 1613dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner if (Error) { 16147d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin std::string msg; 16157d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin raw_string_ostream Msg(msg); 16167d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin Msg << "Invalid operand found in inline asm: '" 1617e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling << AsmStr << "'\n"; 16187d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin MI->print(Msg); 16197d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error(Msg.str()); 16206609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1621c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner } 16226609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 16236609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 16246609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 16256609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1626c5ea263a23f4f15587e35c9cb07cf72a9fba7613Chris Lattner O << "\n\t" << MAI->getCommentString() << MAI->getInlineAsmEnd(); 16276609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner} 16286609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1629da47e6e0d003c873da960361549e57ee4617c301Evan Cheng/// printImplicitDef - This method prints the specified machine instruction 1630da47e6e0d003c873da960361549e57ee4617c301Evan Cheng/// that is an implicit def. 1631da47e6e0d003c873da960361549e57ee4617c301Evan Chengvoid AsmPrinter::printImplicitDef(const MachineInstr *MI) const { 1632c5ea263a23f4f15587e35c9cb07cf72a9fba7613Chris Lattner if (!VerboseAsm) return; 1633c5ea263a23f4f15587e35c9cb07cf72a9fba7613Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 1634c5ea263a23f4f15587e35c9cb07cf72a9fba7613Chris Lattner O << MAI->getCommentString() << " implicit-def: " 1635f806c23a9a297e0b6d19d82ed23c6c5921d6ecd9Chris Lattner << TRI->getName(MI->getOperand(0).getReg()); 1636da47e6e0d003c873da960361549e57ee4617c301Evan Cheng} 1637da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 1638ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesenvoid AsmPrinter::printKill(const MachineInstr *MI) const { 1639ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen if (!VerboseAsm) return; 1640ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen O.PadToColumn(MAI->getCommentColumn()); 1641ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen O << MAI->getCommentString() << " kill:"; 1642ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen for (unsigned n = 0, e = MI->getNumOperands(); n != e; ++n) { 1643ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen const MachineOperand &op = MI->getOperand(n); 1644ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen assert(op.isReg() && "KILL instruction must have only register operands"); 1645ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen O << ' ' << TRI->getName(op.getReg()) << (op.isDef() ? "<def>" : "<kill>"); 1646ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen } 1647ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen} 1648ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen 16491ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey/// printLabel - This method prints a local label used by debug and 16501ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey/// exception handling tables. 16511ee29257428960fede862fcfdbe80d5d007927e9Jim Laskeyvoid AsmPrinter::printLabel(const MachineInstr *MI) const { 1652528bc028774513ee76125f85ceb8f704f5901cc8Dan Gohman printLabel(MI->getOperand(0).getImm()); 16531ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey} 16541ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey 16551b08bbca5592351a940bcd164bdec724ee954326Evan Chengvoid AsmPrinter::printLabel(unsigned Id) const { 1656c5ea263a23f4f15587e35c9cb07cf72a9fba7613Chris Lattner O << MAI->getPrivateGlobalPrefix() << "label" << Id << ':'; 16571b08bbca5592351a940bcd164bdec724ee954326Evan Cheng} 16581b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 16596609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 16606609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// instruction, using the specified assembler variant. Targets should 1661cf0b76649be4eea33aba783d4154ea338b7cbbc2Dale Johannesen/// override this to format as appropriate. 16626609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattnerbool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 1663a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner unsigned AsmVariant, const char *ExtraCode) { 16646609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Target doesn't support this yet! 16656609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner return true; 16660264d1a4777370009176157b76d116b3195e3767Chris Lattner} 1667dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner 1668dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattnerbool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 1669dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner unsigned AsmVariant, 1670dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner const char *ExtraCode) { 1671dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner // Target doesn't support this yet! 1672dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner return true; 1673dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner} 167437efe6764568a3829fee26aba532283131d1a104Nate Begeman 167529cbade25aa094ca9a149a96a8614cf6f3247480Dan GohmanMCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA, 167629cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman const char *Suffix) const { 167729cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman return GetBlockAddressSymbol(BA->getFunction(), BA->getBasicBlock(), Suffix); 16788c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman} 16798c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman 16808c2b52552c90f39e4b2fed43e309e599e742b6acDan GohmanMCSymbol *AsmPrinter::GetBlockAddressSymbol(const Function *F, 168129cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman const BasicBlock *BB, 168229cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman const char *Suffix) const { 16838c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman assert(BB->hasName() && 16848c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman "Address of anonymous basic block not supported yet!"); 16858c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman 1686568a3be545dd1ad256af69549d9b95df474bfd8fDan Gohman // This code must use the function name itself, and not the function number, 1687568a3be545dd1ad256af69549d9b95df474bfd8fDan Gohman // since it must be possible to generate the label name from within other 1688568a3be545dd1ad256af69549d9b95df474bfd8fDan Gohman // functions. 16892f8cc26be403262703ba00658d45e5adf7bdb514Chris Lattner SmallString<60> FnName; 16902f8cc26be403262703ba00658d45e5adf7bdb514Chris Lattner Mang->getNameWithPrefix(FnName, F, false); 16918c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman 16922f8cc26be403262703ba00658d45e5adf7bdb514Chris Lattner // FIXME: THIS IS BROKEN IF THE LLVM BASIC BLOCK DOESN'T HAVE A NAME! 16934813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner SmallString<60> NameResult; 16942f8cc26be403262703ba00658d45e5adf7bdb514Chris Lattner Mang->getNameWithPrefix(NameResult, 16952f8cc26be403262703ba00658d45e5adf7bdb514Chris Lattner StringRef("BA") + Twine((unsigned)FnName.size()) + 16962f8cc26be403262703ba00658d45e5adf7bdb514Chris Lattner "_" + FnName.str() + "_" + BB->getName() + Suffix, 16972f8cc26be403262703ba00658d45e5adf7bdb514Chris Lattner Mangler::Private); 16984813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner 16994813035b726e7f0a3fd17bec437185fc72a50988Chris Lattner return OutContext.GetOrCreateSymbol(NameResult.str()); 17008c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman} 17018c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman 17027cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris LattnerMCSymbol *AsmPrinter::GetMBBSymbol(unsigned MBBID) const { 17037cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner SmallString<60> Name; 17047cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner raw_svector_ostream(Name) << MAI->getPrivateGlobalPrefix() << "BB" 17057cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner << getFunctionNumber() << '_' << MBBID; 17067cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner 17077cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner return OutContext.GetOrCreateSymbol(Name.str()); 17087cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner} 17097cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner 17106b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner/// GetGlobalValueSymbol - Return the MCSymbol for the specified global 17116b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner/// value. 17126b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris LattnerMCSymbol *AsmPrinter::GetGlobalValueSymbol(const GlobalValue *GV) const { 17136b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner SmallString<60> NameStr; 17146b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner Mang->getNameWithPrefix(NameStr, GV, false); 17156b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner return OutContext.GetOrCreateSymbol(NameStr.str()); 17166b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner} 17176b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner 1718d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner/// GetPrivateGlobalValueSymbolStub - Return the MCSymbol for a symbol with 1719d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner/// global value name as its base, with the specified suffix, and where the 1720d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner/// symbol is forced to have private linkage. 1721d588b97cc9acf778282ab10efa4f298cead1215aChris LattnerMCSymbol *AsmPrinter::GetPrivateGlobalValueSymbolStub(const GlobalValue *GV, 1722d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner StringRef Suffix) const { 1723d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner SmallString<60> NameStr; 1724d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner Mang->getNameWithPrefix(NameStr, GV, true); 1725d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner NameStr.append(Suffix.begin(), Suffix.end()); 1726d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner return OutContext.GetOrCreateSymbol(NameStr.str()); 1727d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner} 1728d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner 17296b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner/// GetExternalSymbolSymbol - Return the MCSymbol for the specified 17306b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner/// ExternalSymbol. 17316b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris LattnerMCSymbol *AsmPrinter::GetExternalSymbolSymbol(StringRef Sym) const { 17326b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner SmallString<60> NameStr; 17336b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner Mang->getNameWithPrefix(NameStr, Sym); 17346b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner return OutContext.GetOrCreateSymbol(NameStr.str()); 17356b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner} 17366b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner 17377cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner 173870a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner/// EmitBasicBlockStart - This method prints the label for the specified 173970a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner/// MachineBasicBlock, an alignment (if present) and a comment describing 174070a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner/// it if appropriate. 1741662316c997e4eb8c3fdec6999b3e9da03620847aChris Lattnervoid AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const { 1742b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // Emit an alignment directive for this block, if needed. 174370a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner if (unsigned Align = MBB->getAlignment()) 174470a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner EmitAlignment(Log2_32(Align)); 1745fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 1746b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // If the block has its address taken, emit a special label to satisfy 1747b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // references to the block. This is done so that we don't need to 1748b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // remember the number of this label, and so that we can make 1749b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // forward references to labels without knowing what their numbers 1750b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // will be. 17518c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman if (MBB->hasAddressTaken()) { 17528c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman GetBlockAddressSymbol(MBB->getBasicBlock()->getParent(), 17538c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman MBB->getBasicBlock())->print(O, MAI); 17548c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman O << ':'; 17558c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman if (VerboseAsm) { 17568c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman O.PadToColumn(MAI->getCommentColumn()); 17578c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman O << MAI->getCommentString() << " Address Taken"; 17588c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman } 17598c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman O << '\n'; 17608c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman } 17618c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman 1762b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // Print the main label for the block. 1763e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman if (MBB->pred_empty() || MBB->isOnlyReachableByFallthrough()) { 1764e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman if (VerboseAsm) 1765e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman O << MAI->getCommentString() << " BB#" << MBB->getNumber() << ':'; 1766e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman } else { 1767e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman GetMBBSymbol(MBB->getNumber())->print(O, MAI); 1768e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman O << ':'; 1769e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman if (!VerboseAsm) 1770e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman O << '\n'; 1771e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman } 177270a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner 1773b1cac33856687715bf8db3860ff55ad2f6ca94b5Dan Gohman // Print some comments to accompany the label. 177470a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner if (VerboseAsm) { 1775e45da0dce0af2d6254c7db63a2fe0c3501dd3a5aDan Gohman if (const BasicBlock *BB = MBB->getBasicBlock()) 1776e45da0dce0af2d6254c7db63a2fe0c3501dd3a5aDan Gohman if (BB->hasName()) { 177733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 177833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << ' '; 177946d505647d255410b220d7f8134053390794683eDan Gohman WriteAsOperand(O, BB, /*PrintType=*/false); 1780e45da0dce0af2d6254c7db63a2fe0c3501dd3a5aDan Gohman } 1781b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 178270a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner EmitComments(*MBB); 1783e3cc3f3c84abfdf8eb3bd19dfa806ceea49f15d6Dan Gohman O << '\n'; 1784b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene } 178537efe6764568a3829fee26aba532283131d1a104Nate Begeman} 178652a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 1787cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng/// printPICJumpTableSetLabel - This method prints a set label for the 1788cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng/// specified MachineBasicBlock for a jumptable entry. 1789cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Chengvoid AsmPrinter::printPICJumpTableSetLabel(unsigned uid, 1790cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const { 179133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (!MAI->getSetDirective()) 179252a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman return; 179352a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 179433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix() 1795347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ','; 1796325d3dcfe4d5efc91db0f59b20a72a11dea024edChris Lattner GetMBBSymbol(MBB->getNumber())->print(O, MAI); 179733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1798347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << uid << '\n'; 179952a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman} 1800d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 1801cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Chengvoid AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 1802cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const { 180333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner if (!MAI->getSetDirective()) 180441349c10cbb166c58a20896e4761455f001c611eEvan Cheng return; 180541349c10cbb166c58a20896e4761455f001c611eEvan Cheng 180633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getSetDirective() << ' ' << MAI->getPrivateGlobalPrefix() 1807347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << getFunctionNumber() << '_' << uid << '_' << uid2 1808347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << "_set_" << MBB->getNumber() << ','; 1809325d3dcfe4d5efc91db0f59b20a72a11dea024edChris Lattner GetMBBSymbol(MBB->getNumber())->print(O, MAI); 181033adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << '-' << MAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1811347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << uid << '_' << uid2 << '\n'; 181241349c10cbb166c58a20896e4761455f001c611eEvan Cheng} 181341349c10cbb166c58a20896e4761455f001c611eEvan Cheng 1814d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng/// printDataDirective - This method prints the asm directive for the 1815d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng/// specified type. 1816c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) { 1817d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng const TargetData *TD = TM.getTargetData(); 1818d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng switch (type->getTypeID()) { 1819f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner case Type::FloatTyID: case Type::DoubleTyID: 1820f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner case Type::X86_FP80TyID: case Type::FP128TyID: case Type::PPC_FP128TyID: 1821f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner assert(0 && "Should have already output floating point constant."); 1822f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner default: 1823f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner assert(0 && "Can't handle printing this type of thing"); 1824a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer case Type::IntegerTyID: { 1825a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer unsigned BitWidth = cast<IntegerType>(type)->getBitWidth(); 1826a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer if (BitWidth <= 8) 182733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData8bitsDirective(AddrSpace); 1828a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 16) 182933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace); 1830a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 32) 183133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace); 1832a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 64) { 183333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner assert(MAI->getData64bitsDirective(AddrSpace) && 1834a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer "Target cannot handle 64-bit constant exprs!"); 183533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData64bitsDirective(AddrSpace); 183682f94f1ad98fdcc90e44053437fa555d339a4449Dan Gohman } else { 1837c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Target cannot handle given data directive width!"); 1838a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } 1839d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng break; 1840a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } 1841d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng case Type::PointerTyID: 1842d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng if (TD->getPointerSize() == 8) { 184333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner assert(MAI->getData64bitsDirective(AddrSpace) && 1844d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng "Target cannot handle 64-bit pointer exprs!"); 184533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData64bitsDirective(AddrSpace); 1846fcc6f1556efb386af47293d9f8599bab2b34321cSanjiv Gupta } else if (TD->getPointerSize() == 2) { 184733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData16bitsDirective(AddrSpace); 1848fcc6f1556efb386af47293d9f8599bab2b34321cSanjiv Gupta } else if (TD->getPointerSize() == 1) { 184933adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData8bitsDirective(AddrSpace); 1850a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } else { 185133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getData32bitsDirective(AddrSpace); 1852d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 1853d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng break; 1854d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 1855d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 18564c3a5f8ccba6680b948a1a234f123b4505e43529Dale Johannesen 185753d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattnervoid AsmPrinter::printVisibility(const MCSymbol *Sym, 185853d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner unsigned Visibility) const { 185953d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner if (Visibility == GlobalValue::HiddenVisibility) { 186053d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner if (const char *Directive = MAI->getHiddenDirective()) { 186153d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner O << Directive; 186253d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner Sym->print(O, MAI); 186353d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner O << '\n'; 186453d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner } 186553d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner } else if (Visibility == GlobalValue::ProtectedVisibility) { 186653d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner if (const char *Directive = MAI->getProtectedDirective()) { 186753d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner O << Directive; 186853d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner Sym->print(O, MAI); 186953d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner O << '\n'; 187053d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner } 187153d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner } 187253d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner} 187353d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner 18747751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikovvoid AsmPrinter::printOffset(int64_t Offset) const { 18757751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov if (Offset > 0) 18767751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov O << '+' << Offset; 18777751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov else if (Offset < 0) 18787751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov O << Offset; 18797751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov} 18807751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov 18815eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenGCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) { 18825eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (!S->usesMetadata()) 1883c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen return 0; 1884c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 18855eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen gcp_iterator GCPI = GCMetadataPrinters.find(S); 1886c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen if (GCPI != GCMetadataPrinters.end()) 1887c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen return GCPI->second; 1888c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 18895eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *Name = S->getName().c_str(); 1890c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 1891c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen for (GCMetadataPrinterRegistry::iterator 1892c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen I = GCMetadataPrinterRegistry::begin(), 1893c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen E = GCMetadataPrinterRegistry::end(); I != E; ++I) 1894c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen if (strcmp(Name, I->getName()) == 0) { 18955eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GMP = I->instantiate(); 18965eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GMP->S = S; 18975eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinters.insert(std::make_pair(S, GMP)); 18985eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen return GMP; 1899c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen } 1900c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 1901103289e9383ad1eb66caf28c9b166aebce963a35Chris Lattner errs() << "no GCMetadataPrinter registered for GC: " << Name << "\n"; 1902c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable(0); 1903c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen} 1904014700c1a8cba203fd21ff129426ba8a426ab244David Greene 1905014700c1a8cba203fd21ff129426ba8a426ab244David Greene/// EmitComments - Pretty-print comments for instructions 19065f51cd057984b89e0dc0812d45d512596a3c6596Chris Lattnervoid AsmPrinter::EmitComments(const MachineInstr &MI) const { 19071924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene if (!VerboseAsm) 19081924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene return; 19095f51cd057984b89e0dc0812d45d512596a3c6596Chris Lattner 19101924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene bool Newline = false; 19111924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene 19121924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene if (!MI.getDebugLoc().isUnknown()) { 19131924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene DebugLocTuple DLT = MF->getDebugLocTuple(MI.getDebugLoc()); 19141924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene 19151924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene // Print source line info. 19161924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene O.PadToColumn(MAI->getCommentColumn()); 19173b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman O << MAI->getCommentString() << ' '; 19183b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman DIScope Scope(DLT.Scope); 19193b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman // Omit the directory, because it's likely to be long and uninteresting. 19203b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman if (!Scope.isNull()) 19213b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman O << Scope.getFilename(); 19223b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman else 19233b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman O << "<unknown>"; 19243b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman O << ':' << DLT.Line; 19251924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene if (DLT.Col != 0) 19263b9bc04eda3401618b4fa2318f41b4207d72deceDan Gohman O << ':' << DLT.Col; 19271924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene Newline = true; 19283ac1ab835caacdeebbd0d7b4d69160f283928d21David Greene } 19291924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greene 1930ddff941357bd836243ed7004ab88db09490176d8David Greene // Check for spills and reloads 1931ddff941357bd836243ed7004ab88db09490176d8David Greene int FI; 1932ddff941357bd836243ed7004ab88db09490176d8David Greene 1933ddff941357bd836243ed7004ab88db09490176d8David Greene const MachineFrameInfo *FrameInfo = 1934ddff941357bd836243ed7004ab88db09490176d8David Greene MI.getParent()->getParent()->getFrameInfo(); 1935ddff941357bd836243ed7004ab88db09490176d8David Greene 1936ddff941357bd836243ed7004ab88db09490176d8David Greene // We assume a single instruction only has a spill or reload, not 1937ddff941357bd836243ed7004ab88db09490176d8David Greene // both. 1938f7ea2a534ba4151e091e270c5b908167ab4bba4dDavid Greene const MachineMemOperand *MMO; 1939ddff941357bd836243ed7004ab88db09490176d8David Greene if (TM.getInstrInfo()->isLoadFromStackSlotPostFE(&MI, FI)) { 1940ddff941357bd836243ed7004ab88db09490176d8David Greene if (FrameInfo->isSpillSlotObjectIndex(FI)) { 1941f7ea2a534ba4151e091e270c5b908167ab4bba4dDavid Greene MMO = *MI.memoperands_begin(); 1942ddff941357bd836243ed7004ab88db09490176d8David Greene if (Newline) O << '\n'; 1943ddff941357bd836243ed7004ab88db09490176d8David Greene O.PadToColumn(MAI->getCommentColumn()); 1944fcafe44f564f61016dd2f9367d93c91dfda74c96Dan Gohman O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Reload"; 1945ddff941357bd836243ed7004ab88db09490176d8David Greene Newline = true; 1946ddff941357bd836243ed7004ab88db09490176d8David Greene } 1947ddff941357bd836243ed7004ab88db09490176d8David Greene } 1948f7ea2a534ba4151e091e270c5b908167ab4bba4dDavid Greene else if (TM.getInstrInfo()->hasLoadFromStackSlot(&MI, MMO, FI)) { 1949ddff941357bd836243ed7004ab88db09490176d8David Greene if (FrameInfo->isSpillSlotObjectIndex(FI)) { 1950ddff941357bd836243ed7004ab88db09490176d8David Greene if (Newline) O << '\n'; 1951ddff941357bd836243ed7004ab88db09490176d8David Greene O.PadToColumn(MAI->getCommentColumn()); 1952fcafe44f564f61016dd2f9367d93c91dfda74c96Dan Gohman O << MAI->getCommentString() << ' ' 1953fcafe44f564f61016dd2f9367d93c91dfda74c96Dan Gohman << MMO->getSize() << "-byte Folded Reload"; 1954ddff941357bd836243ed7004ab88db09490176d8David Greene Newline = true; 1955ddff941357bd836243ed7004ab88db09490176d8David Greene } 1956ddff941357bd836243ed7004ab88db09490176d8David Greene } 1957ddff941357bd836243ed7004ab88db09490176d8David Greene else if (TM.getInstrInfo()->isStoreToStackSlotPostFE(&MI, FI)) { 1958ddff941357bd836243ed7004ab88db09490176d8David Greene if (FrameInfo->isSpillSlotObjectIndex(FI)) { 1959f7ea2a534ba4151e091e270c5b908167ab4bba4dDavid Greene MMO = *MI.memoperands_begin(); 1960ddff941357bd836243ed7004ab88db09490176d8David Greene if (Newline) O << '\n'; 1961ddff941357bd836243ed7004ab88db09490176d8David Greene O.PadToColumn(MAI->getCommentColumn()); 1962fcafe44f564f61016dd2f9367d93c91dfda74c96Dan Gohman O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Spill"; 1963ddff941357bd836243ed7004ab88db09490176d8David Greene Newline = true; 1964ddff941357bd836243ed7004ab88db09490176d8David Greene } 1965ddff941357bd836243ed7004ab88db09490176d8David Greene } 1966f7ea2a534ba4151e091e270c5b908167ab4bba4dDavid Greene else if (TM.getInstrInfo()->hasStoreToStackSlot(&MI, MMO, FI)) { 1967ddff941357bd836243ed7004ab88db09490176d8David Greene if (FrameInfo->isSpillSlotObjectIndex(FI)) { 1968ddff941357bd836243ed7004ab88db09490176d8David Greene if (Newline) O << '\n'; 1969ddff941357bd836243ed7004ab88db09490176d8David Greene O.PadToColumn(MAI->getCommentColumn()); 1970fcafe44f564f61016dd2f9367d93c91dfda74c96Dan Gohman O << MAI->getCommentString() << ' ' 1971fcafe44f564f61016dd2f9367d93c91dfda74c96Dan Gohman << MMO->getSize() << "-byte Folded Spill"; 1972ddff941357bd836243ed7004ab88db09490176d8David Greene Newline = true; 1973ddff941357bd836243ed7004ab88db09490176d8David Greene } 1974ddff941357bd836243ed7004ab88db09490176d8David Greene } 1975ddff941357bd836243ed7004ab88db09490176d8David Greene 1976ddff941357bd836243ed7004ab88db09490176d8David Greene // Check for spill-induced copies 1977ddff941357bd836243ed7004ab88db09490176d8David Greene unsigned SrcReg, DstReg, SrcSubIdx, DstSubIdx; 1978ddff941357bd836243ed7004ab88db09490176d8David Greene if (TM.getInstrInfo()->isMoveInstr(MI, SrcReg, DstReg, 1979ddff941357bd836243ed7004ab88db09490176d8David Greene SrcSubIdx, DstSubIdx)) { 1980ddff941357bd836243ed7004ab88db09490176d8David Greene if (MI.getAsmPrinterFlag(ReloadReuse)) { 1981ddff941357bd836243ed7004ab88db09490176d8David Greene if (Newline) O << '\n'; 1982ddff941357bd836243ed7004ab88db09490176d8David Greene O.PadToColumn(MAI->getCommentColumn()); 1983ddff941357bd836243ed7004ab88db09490176d8David Greene O << MAI->getCommentString() << " Reload Reuse"; 1984ddff941357bd836243ed7004ab88db09490176d8David Greene } 1985ddff941357bd836243ed7004ab88db09490176d8David Greene } 1986014700c1a8cba203fd21ff129426ba8a426ab244David Greene} 1987014700c1a8cba203fd21ff129426ba8a426ab244David Greene 1988fe37ab335be5632eab561d49984c95cb06b946d4David Greene/// PrintChildLoopComment - Print comments about child loops within 1989fe37ab335be5632eab561d49984c95cb06b946d4David Greene/// the loop for this basic block, with nesting. 1990fe37ab335be5632eab561d49984c95cb06b946d4David Greene/// 1991fe37ab335be5632eab561d49984c95cb06b946d4David Greenestatic void PrintChildLoopComment(formatted_raw_ostream &O, 1992fe37ab335be5632eab561d49984c95cb06b946d4David Greene const MachineLoop *loop, 199333adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner const MCAsmInfo *MAI, 1994fe37ab335be5632eab561d49984c95cb06b946d4David Greene int FunctionNumber) { 1995fe37ab335be5632eab561d49984c95cb06b946d4David Greene // Add child loop information 1996fe37ab335be5632eab561d49984c95cb06b946d4David Greene for(MachineLoop::iterator cl = loop->begin(), 1997fe37ab335be5632eab561d49984c95cb06b946d4David Greene clend = loop->end(); 1998fe37ab335be5632eab561d49984c95cb06b946d4David Greene cl != clend; 1999fe37ab335be5632eab561d49984c95cb06b946d4David Greene ++cl) { 2000fe37ab335be5632eab561d49984c95cb06b946d4David Greene MachineBasicBlock *Header = (*cl)->getHeader(); 2001fe37ab335be5632eab561d49984c95cb06b946d4David Greene assert(Header && "No header for loop"); 2002fe37ab335be5632eab561d49984c95cb06b946d4David Greene 2003fe37ab335be5632eab561d49984c95cb06b946d4David Greene O << '\n'; 200433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 2005fe37ab335be5632eab561d49984c95cb06b946d4David Greene 200633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString(); 2007c281de1d8485b5ec64f4b330b541f91d1ee86c37Chris Lattner O.indent(((*cl)->getLoopDepth()-1)*2) 2008fe37ab335be5632eab561d49984c95cb06b946d4David Greene << " Child Loop BB" << FunctionNumber << "_" 2009fe37ab335be5632eab561d49984c95cb06b946d4David Greene << Header->getNumber() << " Depth " << (*cl)->getLoopDepth(); 2010fe37ab335be5632eab561d49984c95cb06b946d4David Greene 201133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner PrintChildLoopComment(O, *cl, MAI, FunctionNumber); 2012fe37ab335be5632eab561d49984c95cb06b946d4David Greene } 2013fe37ab335be5632eab561d49984c95cb06b946d4David Greene} 2014fe37ab335be5632eab561d49984c95cb06b946d4David Greene 2015b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene/// EmitComments - Pretty-print comments for basic blocks 20161924aabf996be9335fab34e7ee4fa2aa5911389cDavid Greenevoid AsmPrinter::EmitComments(const MachineBasicBlock &MBB) const { 2017fe37ab335be5632eab561d49984c95cb06b946d4David Greene if (VerboseAsm) { 2018b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene // Add loop depth information 2019b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene const MachineLoop *loop = LI->getLoopFor(&MBB); 2020b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 2021b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene if (loop) { 2022b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene // Print a newline after bb# annotation. 2023b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene O << "\n"; 202433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 202533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " Loop Depth " << loop->getLoopDepth() 2026b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene << '\n'; 2027b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 202833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 2029b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 2030b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene MachineBasicBlock *Header = loop->getHeader(); 2031b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene assert(Header && "No header for loop"); 2032b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 2033b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene if (Header == &MBB) { 203433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " Loop Header"; 203533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner PrintChildLoopComment(O, loop, MAI, getFunctionNumber()); 2036b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene } 2037b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene else { 203833adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " Loop Header is BB" 2039b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene << getFunctionNumber() << "_" << loop->getHeader()->getNumber(); 2040b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene } 2041b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 2042b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene if (loop->empty()) { 2043b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene O << '\n'; 204433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 204533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString() << " Inner Loop"; 2046b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene } 2047b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 2048b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene // Add parent loop information 2049b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene for (const MachineLoop *CurLoop = loop->getParentLoop(); 2050b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene CurLoop; 2051b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene CurLoop = CurLoop->getParentLoop()) { 2052b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene MachineBasicBlock *Header = CurLoop->getHeader(); 2053b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene assert(Header && "No header for loop"); 2054b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 2055b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene O << '\n'; 205633adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O.PadToColumn(MAI->getCommentColumn()); 205733adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner O << MAI->getCommentString(); 2058c281de1d8485b5ec64f4b330b541f91d1ee86c37Chris Lattner O.indent((CurLoop->getLoopDepth()-1)*2) 2059fe37ab335be5632eab561d49984c95cb06b946d4David Greene << " Inside Loop BB" << getFunctionNumber() << "_" 2060b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene << Header->getNumber() << " Depth " << CurLoop->getLoopDepth(); 2061b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene } 2062b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene } 2063b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene } 2064b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene} 2065