AsmPrinter.cpp revision b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2
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" 2137efe6764568a3829fee26aba532283131d1a104Nate Begeman#include "llvm/CodeGen/MachineJumpTableInfo.h" 2284bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/CodeGen/MachineModuleInfo.h" 23c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel#include "llvm/CodeGen/DwarfWriter.h" 24cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis#include "llvm/Analysis/DebugInfo.h" 2542bf74be1402df7409efbea089310d4c276fde37Evan Cheng#include "llvm/Support/CommandLine.h" 267d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/ErrorHandling.h" 27014700c1a8cba203fd21ff129426ba8a426ab244David Greene#include "llvm/Support/FormattedStream.h" 28a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#include "llvm/Support/Mangler.h" 29cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson#include "llvm/Support/raw_ostream.h" 30563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey#include "llvm/Target/TargetAsmInfo.h" 3107000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h" 320336fdba858830d515bf53ac29b8e5ff24dfa823Chris Lattner#include "llvm/Target/TargetLowering.h" 336547e406cf934346db7a206b61bcf09635afff0dEvan Cheng#include "llvm/Target/TargetOptions.h" 34da47e6e0d003c873da960361549e57ee4617c301Evan Cheng#include "llvm/Target/TargetRegisterInfo.h" 35cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng#include "llvm/ADT/SmallPtrSet.h" 36fad86b003a839cef40ec8ce8408322f4913368caChris Lattner#include "llvm/ADT/SmallString.h" 37cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson#include "llvm/ADT/StringExtras.h" 386609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner#include <cerrno> 39a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnerusing namespace llvm; 40a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 4142bf74be1402df7409efbea089310d4c276fde37Evan Chengstatic cl::opt<cl::boolOrDefault> 4242bf74be1402df7409efbea089310d4c276fde37Evan ChengAsmVerbose("asm-verbose", cl::desc("Add comments to directives."), 4342bf74be1402df7409efbea089310d4c276fde37Evan Cheng cl::init(cl::BOU_UNSET)); 4442bf74be1402df7409efbea089310d4c276fde37Evan Cheng 451997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar AsmPrinter::ID = 0; 46cb3718832375a581c5ea23f15918f3ea447a446cOwen AndersonAsmPrinter::AsmPrinter(raw_ostream &o, TargetMachine &tm, 475bcc8bd0c60cfe583ee47852950aad9e532c932eDaniel Dunbar const TargetAsmInfo *T, bool VDef) 485bcc8bd0c60cfe583ee47852950aad9e532c932eDaniel Dunbar : MachineFunctionPass(&ID), FunctionNumber(0), O(o), 49da47e6e0d003c873da960361549e57ee4617c301Evan Cheng TM(tm), TAI(T), TRI(tm.getRegisterInfo()), 50a8dbf36f3f88917b101d7ab9d253ba2fe6e396b4Owen Anderson IsInTextSection(false), LastMI(0), LastFn(0), Counter(~0U), 51a8dbf36f3f88917b101d7ab9d253ba2fe6e396b4Owen Anderson PrevDLT(0, ~0U, ~0U) { 520de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW = 0; MMI = 0; 5342bf74be1402df7409efbea089310d4c276fde37Evan Cheng switch (AsmVerbose) { 5442bf74be1402df7409efbea089310d4c276fde37Evan Cheng case cl::BOU_UNSET: VerboseAsm = VDef; break; 5542bf74be1402df7409efbea089310d4c276fde37Evan Cheng case cl::BOU_TRUE: VerboseAsm = true; break; 5642bf74be1402df7409efbea089310d4c276fde37Evan Cheng case cl::BOU_FALSE: VerboseAsm = false; break; 5742bf74be1402df7409efbea089310d4c276fde37Evan Cheng } 5842bf74be1402df7409efbea089310d4c276fde37Evan Cheng} 59ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 60c317a60c2714a5b90700a11ba646285cb754a5d3Gordon HenriksenAsmPrinter::~AsmPrinter() { 61c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen for (gcp_iterator I = GCMetadataPrinters.begin(), 62c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen E = GCMetadataPrinters.end(); I != E; ++I) 63c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen delete I->second; 64c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen} 65ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 664632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner/// SwitchToTextSection - Switch to the specified text section of the executable 674632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner/// if we are not already in it! 68ac28fbd0436dd8b2bc0c071ba150b60bbfca67f3Chris Lattner/// 694632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattnervoid AsmPrinter::SwitchToTextSection(const char *NewSection, 704632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner const GlobalValue *GV) { 71ac28fbd0436dd8b2bc0c071ba150b60bbfca67f3Chris Lattner std::string NS; 72a7090ae7a3209783ba2a2f7b8ab5744ec3d292b3Chris Lattner if (GV && GV->hasSection()) 73563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey NS = TAI->getSwitchToSectionDirective() + GV->getSection(); 74a7090ae7a3209783ba2a2f7b8ab5744ec3d292b3Chris Lattner else 75a7090ae7a3209783ba2a2f7b8ab5744ec3d292b3Chris Lattner NS = NewSection; 76a7090ae7a3209783ba2a2f7b8ab5744ec3d292b3Chris Lattner 77a7090ae7a3209783ba2a2f7b8ab5744ec3d292b3Chris Lattner // If we're already in this section, we're done. 78a7090ae7a3209783ba2a2f7b8ab5744ec3d292b3Chris Lattner if (CurrentSection == NS) return; 7951b776d25915ca7fbfc14578ff479352a772da06Jeff Cohen 807faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner // Close the current section, if applicable. 81563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty()) 82d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << '\n'; 8351b776d25915ca7fbfc14578ff479352a772da06Jeff Cohen 847faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner CurrentSection = NS; 857faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner 867faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner if (!CurrentSection.empty()) 87563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << CurrentSection << TAI->getTextSectionStartSuffix() << '\n'; 88fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 89fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng IsInTextSection = true; 90ac28fbd0436dd8b2bc0c071ba150b60bbfca67f3Chris Lattner} 91ac28fbd0436dd8b2bc0c071ba150b60bbfca67f3Chris Lattner 922f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman/// SwitchToDataSection - Switch to the specified data section of the executable 934632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner/// if we are not already in it! 944632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner/// 954632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattnervoid AsmPrinter::SwitchToDataSection(const char *NewSection, 964632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner const GlobalValue *GV) { 974632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner std::string NS; 98b81cb6133e224e37b1783fa2343a4789536fb0a4Chris Lattner if (GV && GV->hasSection()) 99563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey NS = TAI->getSwitchToSectionDirective() + GV->getSection(); 100b81cb6133e224e37b1783fa2343a4789536fb0a4Chris Lattner else 101b81cb6133e224e37b1783fa2343a4789536fb0a4Chris Lattner NS = NewSection; 1024632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner 103b81cb6133e224e37b1783fa2343a4789536fb0a4Chris Lattner // If we're already in this section, we're done. 104b81cb6133e224e37b1783fa2343a4789536fb0a4Chris Lattner if (CurrentSection == NS) return; 105b81cb6133e224e37b1783fa2343a4789536fb0a4Chris Lattner 1067faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner // Close the current section, if applicable. 107563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty()) 108d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << '\n'; 1097faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner 1107faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner CurrentSection = NS; 1114632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner 1127faec9b93ad8c1f40ec2dd415c7f2ccbe48cfe30Chris Lattner if (!CurrentSection.empty()) 113563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << CurrentSection << TAI->getDataSectionStartSuffix() << '\n'; 114fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 115fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng IsInTextSection = false; 1164632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner} 1174632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner 118b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov/// SwitchToSection - Switch to the specified section of the executable if we 119b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov/// are not already in it! 120b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikovvoid AsmPrinter::SwitchToSection(const Section* NS) { 121b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov const std::string& NewSection = NS->getName(); 122b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 123b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov // If we're already in this section, we're done. 124b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov if (CurrentSection == NewSection) return; 125b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 126b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov // Close the current section, if applicable. 127b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov if (TAI->getSectionEndDirectiveSuffix() && !CurrentSection.empty()) 128b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov O << CurrentSection << TAI->getSectionEndDirectiveSuffix() << '\n'; 129b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 130b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov // FIXME: Make CurrentSection a Section* in the future 131b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov CurrentSection = NewSection; 132d7ca416d6c9ae1966e0df8193112e3c5f430a053Anton Korobeynikov CurrentSection_ = NS; 133b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 134c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov if (!CurrentSection.empty()) { 135c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov // If section is named we need to switch into it via special '.section' 136c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov // directive and also append funky flags. Otherwise - section name is just 137c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov // some magic assembler directive. 138c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov if (NS->isNamed()) 139c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov O << TAI->getSwitchToSectionDirective() 140c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov << CurrentSection 141c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov << TAI->getSectionFlags(NS->getFlags()); 142c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov else 143c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov O << CurrentSection; 144c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov O << TAI->getDataSectionStartSuffix() << '\n'; 145c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov } 146b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 147b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov IsInTextSection = (NS->getFlags() & SectionFlags::Code); 148b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov} 1494632d7a57008564c4b0f8246e85bd813a200d2c6Chris Lattner 150ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksenvoid AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { 151ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen MachineFunctionPass::getAnalysisUsage(AU); 1525eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen AU.addRequired<GCModuleInfo>(); 153ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen} 154ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 155a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnerbool AsmPrinter::doInitialization(Module &M) { 156bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola Mang = new Mangler(M, TAI->getGlobalPrefix(), TAI->getPrivateGlobalPrefix()); 1572c1b1597f244c836771b4f2668c0ae399d32a5e9Chris Lattner 158a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner if (TAI->doesAllowQuotesInName()) 159a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner Mang->setUseQuotes(true); 160a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner 1611465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 1625eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 163952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola 164952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola if (TAI->hasSingleParameterDotFile()) { 165952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola /* Very minimal debug info. It is ignored if we emit actual 166952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola debug info. If we don't, this at helps the user find where 167952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola a function came from. */ 168952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola O << "\t.file\t\"" << M.getModuleIdentifier() << "\"\n"; 169952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola } 170952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola 1715eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I) 1725eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) 1735eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen MP->beginAssembly(O, *this, *TAI); 174ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 1753e2fa7a746270452316523f27b9055b007feba32Chris Lattner if (!M.getModuleInlineAsm().empty()) 176563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getCommentString() << " Start of file scope inline assembly\n" 1773e2fa7a746270452316523f27b9055b007feba32Chris Lattner << M.getModuleInlineAsm() 178d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman << '\n' << TAI->getCommentString() 179563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey << " End of file scope inline assembly\n"; 1802c1b1597f244c836771b4f2668c0ae399d32a5e9Chris Lattner 181ab4022f196059745c0ca0780b71a80fa67e896beAnton Korobeynikov SwitchToDataSection(""); // Reset back to no section. 182b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1830de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner if (TAI->doesSupportDebugInformation() || 1840de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner TAI->doesSupportExceptionHandling()) { 1850de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner MMI = getAnalysisIfAvailable<MachineModuleInfo>(); 1860de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner if (MMI) 18714a55d952cf238fff42da53a75f39cf06dab184bDevang Patel MMI->AnalyzeModule(M); 1880de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW = getAnalysisIfAvailable<DwarfWriter>(); 1890de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner if (DW) 1900de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW->BeginModule(&M, MMI, O, this, TAI); 19114a55d952cf238fff42da53a75f39cf06dab184bDevang Patel } 19214a55d952cf238fff42da53a75f39cf06dab184bDevang Patel 193a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner return false; 194a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 195a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 196a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnerbool AsmPrinter::doFinalization(Module &M) { 1971f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner // Emit final debug information. 1981f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling()) 1991f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner DW->EndModule(); 2001f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner 2010a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // If the target wants to know about weak references, print them all. 20215404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola if (TAI->getWeakRefDirective()) { 2030a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // FIXME: This is not lazy, it would be nice to only print weak references 2040a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // to stuff that is actually used. Note that doing so would require targets 2050a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // to notice uses in operands (due to constant exprs etc). This should 2060a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // happen with the MC stuff eventually. 2070a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner SwitchToDataSection(""); 2080a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner 2090a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // Print out module-level global variables here. 2100a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 2110a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 2120a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner if (I->hasExternalWeakLinkage()) 213b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner O << TAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n'; 2140a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner } 2150a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner 2160a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner for (Module::const_iterator I = M.begin(), E = M.end(); 2170a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 2180a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner if (I->hasExternalWeakLinkage()) 219b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner O << TAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n'; 2200a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner } 22115404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola } 22215404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola 2238b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov if (TAI->getSetDirective()) { 224a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov if (!M.alias_empty()) 225d7ca416d6c9ae1966e0df8193112e3c5f430a053Anton Korobeynikov SwitchToSection(TAI->getTextSection()); 2268b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 227d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 2288b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); 2290a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 230b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner std::string Name = Mang->getMangledName(I); 231325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov 232325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal()); 233b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner std::string Target = Mang->getMangledName(GV); 234541af7f769c89de8a7f52d563cf317ad7a86c245Anton Korobeynikov 235325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov if (I->hasExternalLinkage() || !TAI->getWeakRefDirective()) 236d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << "\t.globl\t" << Name << '\n'; 2378b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov else if (I->hasWeakLinkage()) 238d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getWeakRefDirective() << Name << '\n'; 239bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola else if (!I->hasLocalLinkage()) 240c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Invalid alias linkage"); 24122c9e65643e0c6b43be37a19e59491ef0081092cAnton Korobeynikov 242541af7f769c89de8a7f52d563cf317ad7a86c245Anton Korobeynikov printVisibility(Name, I->getVisibility()); 24322c9e65643e0c6b43be37a19e59491ef0081092cAnton Korobeynikov 244d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getSetDirective() << ' ' << Name << ", " << Target << '\n'; 2458b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov } 2468b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov } 2478b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2481465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 2495eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 2505eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) 2515eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I)) 2525eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen MP->finishAssembly(O, *this, *TAI); 253ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 254a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman // If we don't have any trampolines, then we don't require stack memory 255a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman // to be executable. Some targets have a directive to declare this. 2560a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); 257a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) 258a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman if (TAI->getNonexecutableStackDirective()) 259d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getNonexecutableStackDirective() << '\n'; 260a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman 261a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner delete Mang; Mang = 0; 2620de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW = 0; MMI = 0; 263a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner return false; 264a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 265a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 2667d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendlingconst std::string & 2677d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill WendlingAsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF, 2687d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling std::string &Name) const { 2696e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling assert(MF && "No machine function?"); 2707d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling Name = MF->getFunction()->getName(); 271dedf502fba8e9a009212233810ce1bcbe10619d0Dale Johannesen if (Name.empty()) 272b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner Name = Mang->getMangledName(MF->getFunction()); 2731cda87c3a07dc097f27e365f7f3ff4bcb31f5699Chris Lattner 274b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner // FIXME: THIS SEEMS REALLY WRONG, it will get two prefixes. 2751cda87c3a07dc097f27e365f7f3ff4bcb31f5699Chris Lattner Name = Mang->makeNameProper(TAI->getEHGlobalPrefix() + Name + ".eh"); 2767d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling return Name; 2776e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling} 2786e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling 27925045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattnervoid AsmPrinter::SetupMachineFunction(MachineFunction &MF) { 280a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner // What's my mangled name? 281b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner CurrentFnName = Mang->getMangledName(MF.getFunction()); 282347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng IncrementFunctionNumber(); 283a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 284a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 2851606e8e4cd937e6de6681f686c266cf61722d972Evan Chengnamespace { 2861606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // SectionCPs - Keep track the alignment, constpool entries per Section. 2871606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng struct SectionCPs { 2881606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng const Section *S; 2891606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Alignment; 2901606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SmallVector<unsigned, 4> CPEs; 2911606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SectionCPs(const Section *s, unsigned a) : S(s), Alignment(a) {}; 2921606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng }; 2931606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng} 2941606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 2953b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// EmitConstantPool - Print to the current output stream assembly 2963b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// representations of the constants in the constant pool MCP. This is 2973b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// used to print out constants which have been "spilled to memory" by 2983b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// the code generator. 2993b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner/// 3003b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattnervoid AsmPrinter::EmitConstantPool(MachineConstantPool *MCP) { 301fa77d43ba1d91ed39f46e11caeb28dcabae9e193Chris Lattner const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants(); 3023b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner if (CP.empty()) return; 3032d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 304088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // Calculate sections for constant pool entries. We collect entries to go into 305088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // the same section together to reduce amount of section switch statements. 3061606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SmallVector<SectionCPs, 4> CPSections; 3072d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng for (unsigned i = 0, e = CP.size(); i != e; ++i) { 3082d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng MachineConstantPoolEntry CPE = CP[i]; 3091606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Align = CPE.getAlignment(); 310088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov const Section* S = TAI->SelectSectionForMachineConst(CPE.getType()); 3111606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // The number of sections are small, just do a linear search from the 3121606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // last section to the first. 3131606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng bool Found = false; 3141606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned SecIdx = CPSections.size(); 3151606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng while (SecIdx != 0) { 3161606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (CPSections[--SecIdx].S == S) { 3171606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng Found = true; 3181606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng break; 3191606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 3201606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 3211606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (!Found) { 3221606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SecIdx = CPSections.size(); 3231606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections.push_back(SectionCPs(S, Align)); 3241606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 3251606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3261606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (Align > CPSections[SecIdx].Alignment) 3271606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections[SecIdx].Alignment = Align; 3281606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections[SecIdx].CPEs.push_back(i); 3292d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng } 3302d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 331088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // Now print stuff into the calculated sections. 3321606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng for (unsigned i = 0, e = CPSections.size(); i != e; ++i) { 3331606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SwitchToSection(CPSections[i].S); 3341606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitAlignment(Log2_32(CPSections[i].Alignment)); 3352d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 3361606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Offset = 0; 3371606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) { 3381606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned CPI = CPSections[i].CPEs[j]; 3391606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng MachineConstantPoolEntry CPE = CP[CPI]; 3401606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3411606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // Emit inter-object padding for alignment. 3421606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned AlignMask = CPE.getAlignment() - 1; 3431606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned NewOffset = (Offset + AlignMask) & ~AlignMask; 3441606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitZeros(NewOffset - Offset); 3451606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3461606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng const Type *Ty = CPE.getType(); 347777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty); 3482d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 349088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' 3501606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng << CPI << ":\t\t\t\t\t"; 3511606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (VerboseAsm) { 3521606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng O << TAI->getCommentString() << ' '; 3531606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng WriteTypeSymbolic(O, CPE.getType(), 0); 3541606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 355088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov O << '\n'; 3561606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (CPE.isMachineConstantPoolEntry()) 3571606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitMachineConstantPoolValue(CPE.Val.MachineCPVal); 358088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov else 3591606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitGlobalConstant(CPE.Val.ConstVal); 3603029f920519e0871a5aad5d7c592281093953733Chris Lattner } 3613b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner } 3623b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner} 3633b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner 36437efe6764568a3829fee26aba532283131d1a104Nate Begeman/// EmitJumpTableInfo - Print assembly representations of the jump tables used 36537efe6764568a3829fee26aba532283131d1a104Nate Begeman/// by the current function to the current output stream. 36637efe6764568a3829fee26aba532283131d1a104Nate Begeman/// 3671da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattnervoid AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI, 3681da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner MachineFunction &MF) { 36937efe6764568a3829fee26aba532283131d1a104Nate Begeman const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 37037efe6764568a3829fee26aba532283131d1a104Nate Begeman if (JT.empty()) return; 3719de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 372acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 3734d9bbdc4408cc871d229677313cc4887862719d7Nate Begeman 3742f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman // Pick the directive to use to print the jump table entries, and switch to 3752f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman // the appropriate section. 376acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey TargetLowering *LoweringInfo = TM.getTargetLowering(); 37724287ddb81aca5d2579dc30ebd3528d2521529d7Anton Korobeynikov 378e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov const char* JumpTableDataSection = TAI->getJumpTableDataSection(); 379e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov const Function *F = MF.getFunction(); 380e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov unsigned SectionFlags = TAI->SectionFlagsForGlobal(F); 381b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng bool JTInDiffSection = false; 38224287ddb81aca5d2579dc30ebd3528d2521529d7Anton Korobeynikov if ((IsPic && !(LoweringInfo && LoweringInfo->usesGlobalOffsetTable())) || 383b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng !JumpTableDataSection || 384e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov SectionFlags & SectionFlags::Linkonce) { 385acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey // In PIC mode, we need to emit the jump table to the same section as the 386acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey // function body itself, otherwise the label differences won't make sense. 387e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov // We should also do if the section name is NULL or function is declared in 388e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov // discardable section. 389c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov SwitchToSection(TAI->SectionForGlobal(F)); 3902f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman } else { 39124287ddb81aca5d2579dc30ebd3528d2521529d7Anton Korobeynikov SwitchToDataSection(JumpTableDataSection); 392b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng JTInDiffSection = true; 3932f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman } 394acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey 395acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey EmitAlignment(Log2_32(MJTI->getAlignment())); 3960c4e6789da4dba6c7b0010886776b24dec3f3bb8Chris Lattner 39737efe6764568a3829fee26aba532283131d1a104Nate Begeman for (unsigned i = 0, e = JT.size(); i != e; ++i) { 39852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman const std::vector<MachineBasicBlock*> &JTBBs = JT[i].MBBs; 39907371882208f913d18a7f2a47373eaee7138416bChris Lattner 40007371882208f913d18a7f2a47373eaee7138416bChris Lattner // If this jump table was deleted, ignore it. 40107371882208f913d18a7f2a47373eaee7138416bChris Lattner if (JTBBs.empty()) continue; 40252a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 40352a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // For PIC codegen, if possible we want to use the SetDirective to reduce 40452a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // the number of relocations the assembler will generate for the jump table. 40552a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // Set directives are all printed before the jump table itself. 406cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng SmallPtrSet<MachineBasicBlock*, 16> EmittedSets; 407acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey if (TAI->getSetDirective() && IsPic) 40852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) 409cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng if (EmittedSets.insert(JTBBs[ii])) 410cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng printPICJumpTableSetLabel(i, JTBBs[ii]); 41152a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 412393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // On some targets (e.g. darwin) we want to emit two consequtive labels 413393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // before each jump table. The first label is never referenced, but tells 414393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // the assembler and linker the extents of the jump table object. The 415393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // second label is actually referenced by the code. 416b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng if (JTInDiffSection) { 417b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng if (const char *JTLabelPrefix = TAI->getJumpTableSpecialLabelPrefix()) 418b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng O << JTLabelPrefix << "JTI" << getFunctionNumber() << '_' << i << ":\n"; 419b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng } 420393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner 421347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 422347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << i << ":\n"; 42352a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 42437efe6764568a3829fee26aba532283131d1a104Nate Begeman for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { 4259de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov printPICJumpTableEntry(MJTI, JTBBs[ii], i); 42637efe6764568a3829fee26aba532283131d1a104Nate Begeman O << '\n'; 42737efe6764568a3829fee26aba532283131d1a104Nate Begeman } 42837efe6764568a3829fee26aba532283131d1a104Nate Begeman } 42937efe6764568a3829fee26aba532283131d1a104Nate Begeman} 43037efe6764568a3829fee26aba532283131d1a104Nate Begeman 4319de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikovvoid AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 4329de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const MachineBasicBlock *MBB, 4339de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov unsigned uid) const { 4349de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 4359de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4369de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // Use JumpTableDirective otherwise honor the entry size from the jump table 4379de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // info. 4389de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const char *JTEntryDirective = TAI->getJumpTableDirective(); 4399de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov bool HadJTEntryDirective = JTEntryDirective != NULL; 4409de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (!HadJTEntryDirective) { 4419de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov JTEntryDirective = MJTI->getEntrySize() == 4 ? 4429de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov TAI->getData32bitsDirective() : TAI->getData64bitsDirective(); 4439de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4449de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4459de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov O << JTEntryDirective << ' '; 4469de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4479de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If we have emitted set directives for the jump table entries, print 4489de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // them rather than the entries themselves. If we're emitting PIC, then 4499de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // emit the table entries as differences between two text section labels. 4509de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If we're emitting non-PIC code, then emit the entries as direct 4519de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // references to the target basic blocks. 4529de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (IsPic) { 4539de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (TAI->getSetDirective()) { 4549de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov O << TAI->getPrivateGlobalPrefix() << getFunctionNumber() 4559de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov << '_' << uid << "_set_" << MBB->getNumber(); 4569de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } else { 457fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 4589de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If the arch uses custom Jump Table directives, don't calc relative to 4599de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // JT 4609de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (!HadJTEntryDirective) 4619de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" 4629de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov << getFunctionNumber() << '_' << uid; 4639de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4649de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } else { 465fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 4669de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4679de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov} 4689de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4699de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 470ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// EmitSpecialLLVMGlobal - Check to see if the specified global is a 471ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// special global used by LLVM. If so, emit it and return true, otherwise 472ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// do nothing and return false. 473ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattnerbool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { 474b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth if (GV->getName() == "llvm.used") { 475b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth if (TAI->getUsedDirective() != 0) // No need to emit this at all. 476b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth EmitLLVMUsedList(GV->getInitializer()); 477b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth return true; 478b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth } 479b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth 4807809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey // Ignore debug and non-emitted data. 481266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner if (GV->getSection() == "llvm.metadata" || 482266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner GV->hasAvailableExternallyLinkage()) 483266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner return true; 4847809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey 4857809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey if (!GV->hasAppendingLinkage()) return false; 4867809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey 4877809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey assert(GV->hasInitializer() && "Not a special LLVM global!"); 488ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 489916d07cdfa89e77118043ec6e14575512ae1bf85Evan Cheng const TargetData *TD = TM.getTargetData(); 490916d07cdfa89e77118043ec6e14575512ae1bf85Evan Cheng unsigned Align = Log2_32(TD->getPointerPrefAlignment()); 491f231c07228deb75b6cd5ae7c9c057bc8303c6998Chris Lattner if (GV->getName() == "llvm.global_ctors") { 492ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner SwitchToDataSection(TAI->getStaticCtorsSection()); 493ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitAlignment(Align, 0); 494ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitXXStructorList(GV->getInitializer()); 495ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner return true; 496ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 497ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 498f231c07228deb75b6cd5ae7c9c057bc8303c6998Chris Lattner if (GV->getName() == "llvm.global_dtors") { 499ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner SwitchToDataSection(TAI->getStaticDtorsSection()); 500ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitAlignment(Align, 0); 501ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitXXStructorList(GV->getInitializer()); 502ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner return true; 503ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 504ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 505ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner return false; 506ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner} 507ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 50861e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen/// findGlobalValue - if CV is an expression equivalent to a single 50961e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen/// global value, return that value. 51061e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesenconst GlobalValue * AsmPrinter::findGlobalValue(const Constant *CV) { 51161e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) 51261e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen return GV; 51361e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) { 51461e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen const TargetData *TD = TM.getTargetData(); 51561e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen unsigned Opcode = CE->getOpcode(); 51661e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen switch (Opcode) { 51761e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen case Instruction::GetElementPtr: { 51861e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen const Constant *ptrVal = CE->getOperand(0); 51961e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end()); 52061e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen if (TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], idxVec.size())) 52161e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen return 0; 52261e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen return findGlobalValue(ptrVal); 52361e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen } 52461e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen case Instruction::BitCast: 52561e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen return findGlobalValue(CE->getOperand(0)); 52661e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen default: 52761e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen return 0; 52861e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen } 52961e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen } 53061e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen return 0; 53161e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen} 53261e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen 533cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner/// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each 534d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen/// global in the specified llvm.used list for which emitUsedDirectiveFor 535d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen/// is true, as being used with this directive. 536d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen 537cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattnervoid AsmPrinter::EmitLLVMUsedList(Constant *List) { 538cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner const char *Directive = TAI->getUsedDirective(); 539cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 540a119de86a064414622562cfe32953de7f9b0ee40Dan Gohman // Should be an array of 'i8*'. 541cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner ConstantArray *InitList = dyn_cast<ConstantArray>(List); 542cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner if (InitList == 0) return; 543cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 544cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 54561e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen const GlobalValue *GV = findGlobalValue(InitList->getOperand(i)); 546d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen if (TAI->emitUsedDirectiveFor(GV, Mang)) { 54761e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen O << Directive; 54861e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen EmitConstantValueOnly(InitList->getOperand(i)); 54961e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen O << '\n'; 55061e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen } 551cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner } 552cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner} 553cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 554ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the 555ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// function pointers, ignoring the init priority. 556ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattnervoid AsmPrinter::EmitXXStructorList(Constant *List) { 557ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner // Should be an array of '{ int, void ()* }' structs. The first value is the 558ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner // init priority, which we ignore. 559ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (!isa<ConstantArray>(List)) return; 560ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner ConstantArray *InitList = cast<ConstantArray>(List); 561ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 562ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){ 563ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. 5648de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner 5658de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner if (CS->getOperand(1)->isNullValue()) 5668de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner return; // Found a null terminator, exit printing. 5678de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner // Emit the function pointer. 568ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner EmitGlobalConstant(CS->getOperand(1)); 569ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 570ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner} 5713b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner 572a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey/// getGlobalLinkName - Returns the asm/link name of of the specified 573a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey/// global variable. Should be overridden by each target asm printer to 574a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey/// generate the appropriate value. 5757d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendlingconst std::string &AsmPrinter::getGlobalLinkName(const GlobalVariable *GV, 5767d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling std::string &LinkName) const { 5770374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey if (isa<Function>(GV)) { 5780374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getFunctionAddrPrefix(); 579b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner LinkName += Mang->getMangledName(GV); 5800374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getFunctionAddrSuffix(); 5810374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey } else { 5820374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getGlobalVarAddrPrefix(); 583b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner LinkName += Mang->getMangledName(GV); 5840374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getGlobalVarAddrSuffix(); 5850374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey } 5860374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey 58799e41eed6d8b89b2ba4807625d13d08d85ea493dJim Laskey return LinkName; 588a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey} 589a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 590bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey/// EmitExternalGlobal - Emit the external reference to a global variable. 591bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey/// Should be overridden if an indirect reference should be used. 592bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskeyvoid AsmPrinter::EmitExternalGlobal(const GlobalVariable *GV) { 5937d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling std::string GLN; 5947d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling O << getGlobalLinkName(GV, GLN); 595bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey} 596bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 597bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 598bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 599f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===----------------------------------------------------------------------===// 600f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// LEB 128 number encoding. 601f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 602f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// PrintULEB128 - Print a series of hexidecimal values (separated by commas) 603f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// representing an unsigned leb128 value. 604f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintULEB128(unsigned Value) const { 605a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner char Buffer[20]; 606f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey do { 607a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 608f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey Value >>= 7; 609f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (Value) Byte |= 0x80; 610a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << "0x" << utohex_buffer(Byte, Buffer+20); 611f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (Value) O << ", "; 612f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } while (Value); 613f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 614f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 615f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// PrintSLEB128 - Print a series of hexidecimal values (separated by commas) 616f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// representing a signed leb128 value. 617f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintSLEB128(int Value) const { 618f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey int Sign = Value >> (8 * sizeof(Value) - 1); 619f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey bool IsMore; 620a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner char Buffer[20]; 621ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov 622f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey do { 623a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 624f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey Value >>= 7; 625f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 626f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (IsMore) Byte |= 0x80; 627a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << "0x" << utohex_buffer(Byte, Buffer+20); 628f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (IsMore) O << ", "; 629f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } while (IsMore); 630f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 631f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 632f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===--------------------------------------------------------------------===// 633f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey// Emission and print routines 634f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey// 635f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 636f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// PrintHex - Print a value as a hexidecimal value. 637f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 638f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintHex(int Value) const { 639c6a1346d7c6bb761f9e6c2c85b53febba1cb15dbChris Lattner char Buffer[20]; 640c6a1346d7c6bb761f9e6c2c85b53febba1cb15dbChris Lattner O << "0x" << utohex_buffer(static_cast<unsigned>(Value), Buffer+20); 641f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 642f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 643f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EOL - Print a newline character to asm stream. If a comment is present 644f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// then it will be printed first. Comments should not contain '\n'. 645bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskeyvoid AsmPrinter::EOL() const { 646d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 647bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey} 64825995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson 649f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EOL(const std::string &Comment) const { 6506547e406cf934346db7a206b61bcf09635afff0dEvan Cheng if (VerboseAsm && !Comment.empty()) { 651d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\t' 652f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << TAI->getCommentString() 653d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman << ' ' 654f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Comment; 655f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 656d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 657f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 658f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 65925995093e785f4794b3590f3df70fbfe834a00a1Owen Andersonvoid AsmPrinter::EOL(const char* Comment) const { 6606547e406cf934346db7a206b61bcf09635afff0dEvan Cheng if (VerboseAsm && *Comment) { 66125995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson O << '\t' 66225995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << TAI->getCommentString() 66325995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << ' ' 66425995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << Comment; 66525995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson } 66625995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson O << '\n'; 66725995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson} 66825995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson 669f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 670f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// unsigned leb128 value. 671f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitULEB128Bytes(unsigned Value) const { 672f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TAI->hasLEB128()) { 673f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\t.uleb128\t" 674f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Value; 675f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 676f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData8bitsDirective(); 677f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintULEB128(Value); 678f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 679f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 680f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 681f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitSLEB128Bytes - print an assembler byte data directive to compose a 682f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// signed leb128 value. 683f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitSLEB128Bytes(int Value) const { 684f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TAI->hasLEB128()) { 685f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\t.sleb128\t" 686f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Value; 687f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 688f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData8bitsDirective(); 689f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintSLEB128(Value); 690f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 691f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 692f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 693f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt8 - Emit a byte directive and value. 694f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 695f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt8(int Value) const { 696f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData8bitsDirective(); 697f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value & 0xFF); 698f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 699f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 700f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt16 - Emit a short directive and value. 701f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 702f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt16(int Value) const { 703f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData16bitsDirective(); 704f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value & 0xFFFF); 705f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 706f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 707f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt32 - Emit a long directive and value. 708f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 709f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt32(int Value) const { 710f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData32bitsDirective(); 711f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value); 712f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 713f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 714f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt64 - Emit a long long directive and value. 715f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 716f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt64(uint64_t Value) const { 717f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TAI->getData64bitsDirective()) { 718f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData64bitsDirective(); 719f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value); 720f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 721f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TM.getTargetData()->isBigEndian()) { 722d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman EmitInt32(unsigned(Value >> 32)); O << '\n'; 723f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey EmitInt32(unsigned(Value)); 724f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 725d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman EmitInt32(unsigned(Value)); O << '\n'; 726f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey EmitInt32(unsigned(Value >> 32)); 727f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 728f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 729f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 730f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 731f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// toOctal - Convert the low order bits of X into an octal digit. 732f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 733f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeystatic inline char toOctal(int X) { 734f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey return (X&7)+'0'; 735f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 736f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 737f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// printStringChar - Print a char, escaped if necessary. 738f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 739a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattnerstatic void printStringChar(raw_ostream &O, unsigned char C) { 740f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (C == '"') { 741f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\\\""; 742f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else if (C == '\\') { 743f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\\\\"; 744bbfa244b2fa986c53a1bcf38b6dd0fea082afaaaChris Lattner } else if (isprint((unsigned char)C)) { 745f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << C; 746f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 747f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey switch(C) { 748f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\b': O << "\\b"; break; 749f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\f': O << "\\f"; break; 750f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\n': O << "\\n"; break; 751f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\r': O << "\\r"; break; 752f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\t': O << "\\t"; break; 753f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey default: 754f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << '\\'; 755f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 6); 756f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 3); 757f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 0); 758f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey break; 759f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 760f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 761f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 762f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 763f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitString - Emit a string with quotes and a null terminator. 764f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// Special characters are emitted properly. 765f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// \literal (Eg. '\t') \endliteral 766f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitString(const std::string &String) const { 767f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling EmitString(String.c_str(), String.size()); 768f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling} 769f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling 770f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendlingvoid AsmPrinter::EmitString(const char *String, unsigned Size) const { 771fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov const char* AscizDirective = TAI->getAscizDirective(); 772fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov if (AscizDirective) 773fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << AscizDirective; 774fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov else 775fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << TAI->getAsciiDirective(); 776d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 777f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling for (unsigned i = 0; i < Size; ++i) 778a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner printStringChar(O, String[i]); 779fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov if (AscizDirective) 780d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 781fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov else 782fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << "\\0\""; 783f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 784f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 785f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 786189f80dc253664627253b2d2cb07d0714feb12baDan Gohman/// EmitFile - Emit a .file directive. 787189f80dc253664627253b2d2cb07d0714feb12baDan Gohmanvoid AsmPrinter::EmitFile(unsigned Number, const std::string &Name) const { 788189f80dc253664627253b2d2cb07d0714feb12baDan Gohman O << "\t.file\t" << Number << " \""; 789a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner for (unsigned i = 0, N = Name.size(); i < N; ++i) 790a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner printStringChar(O, Name[i]); 791d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 792189f80dc253664627253b2d2cb07d0714feb12baDan Gohman} 793189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 794189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 795f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===----------------------------------------------------------------------===// 796f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 7973a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// EmitAlignment - Emit an alignment directive to the specified power of 7983a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// two boundary. For example, if you pass in 3 here, you will get an 8 7993a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// byte alignment. If a global value is specified, and if that global has 8003a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// an explicit alignment requested, it will unconditionally override the 8013a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// alignment request. However, if ForcedAlignBits is specified, this value 8023a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// has final say: the ultimate alignment will be the max of ForcedAlignBits 8033a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// and the alignment computed with NumBits and the global. 8043a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// 8053a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// The algorithm is: 8063a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// Align = NumBits; 8073a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// if (GV && GV->hasalignment) Align = GV->getalignment(); 8083a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// Align = std::max(Align, ForcedAlignBits); 8093a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// 8103a4205367dc845d4cd804b47e061f8281777c9daChris Lattnervoid AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, 81105548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits, 81205548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr) const { 81300d56b96e599acbc4f895e86e17029ae7c45f142Dale Johannesen if (GV && GV->getAlignment()) 8143a4205367dc845d4cd804b47e061f8281777c9daChris Lattner NumBits = Log2_32(GV->getAlignment()); 8153a4205367dc845d4cd804b47e061f8281777c9daChris Lattner NumBits = std::max(NumBits, ForcedAlignBits); 8163a4205367dc845d4cd804b47e061f8281777c9daChris Lattner 8172a21c6e86101c857d683e7bdefb775654ccab7e3Chris Lattner if (NumBits == 0) return; // No need to emit alignment. 818563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits; 81973a259a9d1814912255aee6c185c5aeb7bb581baEvan Cheng O << TAI->getAlignDirective() << NumBits; 820fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 821fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng unsigned FillValue = TAI->getTextAlignFillValue(); 82205548eb174dd694b651de334b73197a62e5071f1Evan Cheng UseFillExpr &= IsInTextSection && FillValue; 823a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner if (UseFillExpr) { 824a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << ','; 825a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner PrintHex(FillValue); 826a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner } 827d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 828bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner} 829bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 830bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 83125045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner/// EmitZeros - Emit a block of zeros. 8327d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner/// 833c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitZeros(uint64_t NumZeros, unsigned AddrSpace) const { 8347d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner if (NumZeros) { 835563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getZeroDirective()) { 836563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getZeroDirective() << NumZeros; 837563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getZeroDirectiveSuffix()) 838563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getZeroDirectiveSuffix(); 839d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 840c6a057b04db506152c98355b51ba15d82a15b90aJeff Cohen } else { 8417d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner for (; NumZeros; --NumZeros) 842c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData8bitsDirective(AddrSpace) << "0\n"; 8437d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner } 8447d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner } 8457d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner} 8467d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner 847a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// Print out the specified constant, without a storage class. Only the 848a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// constants valid in constant expressions can occur here. 84925045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattnervoid AsmPrinter::EmitConstantValueOnly(const Constant *CV) { 850bd1d382cc47dfc43ee758714bc22ab5a750bad15Chris Lattner if (CV->isNullValue() || isa<UndefValue>(CV)) 851d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '0'; 8526b6b6ef1677fa71b1072c2911b4c1f9524a558c9Zhou Sheng else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 8534315eee376450972d111c8e263ca8aecc7a3a13bScott Michel O << CI->getZExtValue(); 854b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) { 855855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // This is a constant address for a global variable or function. Use the 856855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // name of the variable or function as the address value, possibly 857855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // decorating it with GlobalVarAddrPrefix/Suffix or 858855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // FunctionAddrPrefix/Suffix (these all default to "" ) 859563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (isa<Function>(GV)) { 860563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getFunctionAddrPrefix() 861b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner << Mang->getMangledName(GV) 862563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey << TAI->getFunctionAddrSuffix(); 863563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey } else { 864563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getGlobalVarAddrPrefix() 865b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner << Mang->getMangledName(GV) 866563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey << TAI->getGlobalVarAddrSuffix(); 867563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey } 868855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) { 869a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson const TargetData *TD = TM.getTargetData(); 87013b7d3d499ec63c5f417f7a7246afb77adb63b2eAnton Korobeynikov unsigned Opcode = CE->getOpcode(); 87113b7d3d499ec63c5f417f7a7246afb77adb63b2eAnton Korobeynikov switch (Opcode) { 872a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner case Instruction::GetElementPtr: { 873a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner // generate a symbolic expression for the byte address 874a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner const Constant *ptrVal = CE->getOperand(0); 8757f6b9d2f1a7d55f6a84a1e8078b895ce4ff66daeChris Lattner SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end()); 8767f6b9d2f1a7d55f6a84a1e8078b895ce4ff66daeChris Lattner if (int64_t Offset = TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], 8777f6b9d2f1a7d55f6a84a1e8078b895ce4ff66daeChris Lattner idxVec.size())) { 8784798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner // Truncate/sext the offset to the pointer size. 8794798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner if (TD->getPointerSizeInBits() != 64) { 8804798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner int SExtAmount = 64-TD->getPointerSizeInBits(); 8814798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner Offset = (Offset << SExtAmount) >> SExtAmount; 8824798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner } 8834798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner 88427e192196fec42618c7fcbd865e8e0b541545671Chris Lattner if (Offset) 885d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '('; 88625045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(ptrVal); 88727e192196fec42618c7fcbd865e8e0b541545671Chris Lattner if (Offset > 0) 88827e192196fec42618c7fcbd865e8e0b541545671Chris Lattner O << ") + " << Offset; 88927e192196fec42618c7fcbd865e8e0b541545671Chris Lattner else if (Offset < 0) 89027e192196fec42618c7fcbd865e8e0b541545671Chris Lattner O << ") - " << -Offset; 891a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } else { 89225045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(ptrVal); 893a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 894a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner break; 895a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 8963da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::Trunc: 8973da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::ZExt: 8983da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::SExt: 8993da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPTrunc: 9003da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPExt: 9013da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::UIToFP: 9023da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::SIToFP: 9033da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPToUI: 9043da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPToSI: 905c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("FIXME: Don't yet support this kind of constant cast expr"); 9063da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer break; 907cb0a6819895bf5e357a205b72f0a6fce90025f21Chris Lattner case Instruction::BitCast: 908cb0a6819895bf5e357a205b72f0a6fce90025f21Chris Lattner return EmitConstantValueOnly(CE->getOperand(0)); 909cb0a6819895bf5e357a205b72f0a6fce90025f21Chris Lattner 910ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner case Instruction::IntToPtr: { 911ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // Handle casts to pointers by changing them into casts to the appropriate 912ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // integer type. This promotes constant folding and simplifies this code. 913ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner Constant *Op = CE->getOperand(0); 914ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner Op = ConstantExpr::getIntegerCast(Op, TD->getIntPtrType(), false/*ZExt*/); 915ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner return EmitConstantValueOnly(Op); 916ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner } 917ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner 918ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner 919ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner case Instruction::PtrToInt: { 9204a6bd33da0e30c26568baf3ad6c94d1f497e5ea7Chris Lattner // Support only foldable casts to/from pointers that can be eliminated by 9214a6bd33da0e30c26568baf3ad6c94d1f497e5ea7Chris Lattner // changing the pointer to the appropriately sized integer type. 922a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Constant *Op = CE->getOperand(0); 923ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner const Type *Ty = CE->getType(); 924a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 925ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // We can emit the pointer value into this slot if the slot is an 926ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // integer slot greater or equal to the size of the pointer. 927777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands if (TD->getTypeAllocSize(Ty) >= TD->getTypeAllocSize(Op->getType())) 9284a6bd33da0e30c26568baf3ad6c94d1f497e5ea7Chris Lattner return EmitConstantValueOnly(Op); 929d6227385fc499a8b8bc23766735f1d809d194378Nick Lewycky 930d6227385fc499a8b8bc23766735f1d809d194378Nick Lewycky O << "(("; 93125045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(Op); 932777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands APInt ptrMask = APInt::getAllOnesValue(TD->getTypeAllocSizeInBits(Ty)); 933fad86b003a839cef40ec8ce8408322f4913368caChris Lattner 934fad86b003a839cef40ec8ce8408322f4913368caChris Lattner SmallString<40> S; 935fad86b003a839cef40ec8ce8408322f4913368caChris Lattner ptrMask.toStringUnsigned(S); 936fad86b003a839cef40ec8ce8408322f4913368caChris Lattner O << ") & " << S.c_str() << ')'; 937a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner break; 938a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 939a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner case Instruction::Add: 94013b7d3d499ec63c5f417f7a7246afb77adb63b2eAnton Korobeynikov case Instruction::Sub: 941feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::And: 942feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Or: 943feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Xor: 944d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '('; 94525045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(CE->getOperand(0)); 946d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << ')'; 947feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov switch (Opcode) { 948feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Add: 949feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " + "; 950feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 951feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Sub: 952feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " - "; 953feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 954feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::And: 955feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " & "; 956feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 957feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Or: 958feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " | "; 959feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 960feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Xor: 961feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " ^ "; 962feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 963feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov default: 964feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 965feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov } 966d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '('; 96725045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(CE->getOperand(1)); 968d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << ')'; 969a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner break; 970a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner default: 971c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unsupported operator!"); 972a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 973a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } else { 974c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unknown constant value!"); 975a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 976a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 9771b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 9782980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner/// printAsCString - Print the specified array as a C compatible string, only if 9791b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner/// the predicate isString is true. 9801b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner/// 981cb3718832375a581c5ea23f15918f3ea447a446cOwen Andersonstatic void printAsCString(raw_ostream &O, const ConstantArray *CVA, 9822980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner unsigned LastElt) { 9831b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner assert(CVA->isString() && "Array is not string compatible!"); 9841b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 985d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 9862980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner for (unsigned i = 0; i != LastElt; ++i) { 987edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman unsigned char C = 988b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer (unsigned char)cast<ConstantInt>(CVA->getOperand(i))->getZExtValue(); 989f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey printStringChar(O, C); 9901b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 991d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 9921b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner} 9931b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 994c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen/// EmitString - Emit a zero-byte-terminated string constant. 995c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen/// 996c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohenvoid AsmPrinter::EmitString(const ConstantArray *CVA) const { 997c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen unsigned NumElts = CVA->getNumOperands(); 998563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getAscizDirective() && NumElts && 999b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer cast<ConstantInt>(CVA->getOperand(NumElts-1))->getZExtValue() == 0) { 1000563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getAscizDirective(); 1001c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen printAsCString(O, CVA, NumElts-1); 1002c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen } else { 1003563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getAsciiDirective(); 1004c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen printAsCString(O, CVA, NumElts); 1005c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen } 1006d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 1007c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen} 1008c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 1009d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantArray(const ConstantArray *CVA, 1010d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta unsigned AddrSpace) { 101100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (CVA->isString()) { 101200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitString(CVA); 101300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { // Not a string. Print the values in successive locations 101400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i) 1015d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta EmitGlobalConstant(CVA->getOperand(i), AddrSpace); 101600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 101700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 101800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 101900d448a341175556ebd86af68219f5b90b7145a3Dan Gohmanvoid AsmPrinter::EmitGlobalConstantVector(const ConstantVector *CP) { 102000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const VectorType *PTy = CP->getType(); 102100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 102200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned I = 0, E = PTy->getNumElements(); I < E; ++I) 102300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitGlobalConstant(CP->getOperand(I)); 102400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 102500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1026c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantStruct(const ConstantStruct *CVS, 1027c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 102800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Print the fields in successive locations. Pad to align if needed! 102900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 1030777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands unsigned Size = TD->getTypeAllocSize(CVS->getType()); 103100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const StructLayout *cvsLayout = TD->getStructLayout(CVS->getType()); 103200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t sizeSoFar = 0; 103300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = CVS->getNumOperands(); i != e; ++i) { 103400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const Constant* field = CVS->getOperand(i); 103500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 103600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Check if padding is needed and insert one or more 0s. 1037777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands uint64_t fieldSize = TD->getTypeAllocSize(field->getType()); 103800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t padSize = ((i == e-1 ? Size : cvsLayout->getElementOffset(i+1)) 103900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman - cvsLayout->getElementOffset(i)) - fieldSize; 104000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman sizeSoFar += fieldSize + padSize; 104100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 104200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Now print the actual field value. 1043c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstant(field, AddrSpace); 104400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 104500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Insert padding - this may include padding to increase the size of the 104600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // current field up to the ABI size (if the struct is not packed) as well 104700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // as padding to ensure that the next field starts at the right offset. 1048c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitZeros(padSize, AddrSpace); 104900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 105000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman assert(sizeSoFar == cvsLayout->getSizeInBytes() && 105100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman "Layout of constant struct may be incorrect!"); 105200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 105300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1054c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP, 1055c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 105600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // FP Constants are printed as integer constants to avoid losing 105700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // precision... 105800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 105900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (CFP->getType() == Type::DoubleTy) { 106000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman double Val = CFP->getValueAPF().convertToDouble(); // for comment only 106100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1062f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (TAI->getData64bitsDirective(AddrSpace)) { 1063f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData64bitsDirective(AddrSpace) << i; 1064f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1065f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " double value: " << Val; 1066f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1067f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng } else if (TD->isBigEndian()) { 1068f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1069f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1070f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1071f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double most significant word " << Val; 1072f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1073f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1074f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1075f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1076f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double least significant word " << Val; 1077f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 107800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1079f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1080f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1081f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1082f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double least significant word " << Val; 1083f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1084f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1085f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1086f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1087f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double most significant word " << Val; 1088f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 108900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 109000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 109100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (CFP->getType() == Type::FloatTy) { 109200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman float Val = CFP->getValueAPF().convertToFloat(); // for comment only 1093c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData32bitsDirective(AddrSpace) 1094f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1095f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1096f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " float " << Val; 1097f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 109800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 109900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (CFP->getType() == Type::X86_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()) { 1110f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1111f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1112f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1113f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant halfword of ~" 1114f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << DoubleVal.convertToDouble(); 1115f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1116f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1117f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1118f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " long double next halfword"; 1119f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1120f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1121f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1122f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " long double next halfword"; 1123f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1124f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1125f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1126f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " long double next halfword"; 1127f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1128f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1129f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1130f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1131f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant halfword"; 1132f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 113300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1134f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1135f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1136f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1137f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant halfword of ~" 1138f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << DoubleVal.convertToDouble(); 1139f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1140f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1141f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1142f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1143f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next halfword"; 1144f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1145f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1146f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1147f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1148f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next halfword"; 1149f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1150f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1151f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1152f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1153f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next halfword"; 1154f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1155f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1156f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1157f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1158f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant halfword"; 1159f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 116000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 1161777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands EmitZeros(TD->getTypeAllocSize(Type::X86_FP80Ty) - 1162c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta TD->getTypeStoreSize(Type::X86_FP80Ty), AddrSpace); 116300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 116400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (CFP->getType() == Type::PPC_FP128Ty) { 116500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // all long double variants are printed as hex 116600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // api needed to prevent premature destruction 116700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman APInt api = CFP->getValueAPF().bitcastToAPInt(); 116800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *p = api.getRawData(); 116900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) { 1170f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1171f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1172f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1173f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant word"; 1174f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1175f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1176f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1177f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1178f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1179f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1180f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1181f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1182f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1183f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1184f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1185f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1186f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1187f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1188f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant word"; 1189f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 119000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1191f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1192f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1193f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1194f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant word"; 1195f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1196f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1197f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1198f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1199f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1200f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1201f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1202f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1203f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1204f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1205f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1206f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1207f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1208f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1209f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant word"; 1210f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 121100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 121200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 1213c23197a26f34f559ea9797de51e187087c039c42Torok Edwin } else llvm_unreachable("Floating point constant type not handled"); 121400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 121500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1216c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI, 1217c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 121800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 121900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman unsigned BitWidth = CI->getBitWidth(); 122000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman assert(isPowerOf2_32(BitWidth) && 122100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman "Non-power-of-2-sized integers not handled!"); 122200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 122300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // We don't expect assemblers to support integer data directives 122400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // for more than 64 bits, so we emit the data in at most 64-bit 122500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // quantities at a time. 122600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *RawData = CI->getValue().getRawData(); 122700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) { 122800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t Val; 122900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) 123000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman Val = RawData[e - i - 1]; 123100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman else 123200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman Val = RawData[i]; 123300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1234c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta if (TAI->getData64bitsDirective(AddrSpace)) 1235c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData64bitsDirective(AddrSpace) << Val << '\n'; 123600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman else if (TD->isBigEndian()) { 1237f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32); 1238f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1239f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1240f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word most significant word " << Val; 1241f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1242f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val); 1243f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1244f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1245f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word least significant word " << Val; 1246f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 124700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1248f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val); 1249f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1250f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1251f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word least significant word " << Val; 1252f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1253f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32); 1254f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1255f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1256f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word most significant word " << Val; 1257f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 125800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 125900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 126000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 126100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 126225045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner/// EmitGlobalConstant - Print a general LLVM constant to the .s file. 1263c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { 1264a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson const TargetData *TD = TM.getTargetData(); 126500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const Type *type = CV->getType(); 1266777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands unsigned Size = TD->getTypeAllocSize(type); 12671b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 1268bd1d382cc47dfc43ee758714bc22ab5a750bad15Chris Lattner if (CV->isNullValue() || isa<UndefValue>(CV)) { 1269c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitZeros(Size, AddrSpace); 12701b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12711b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } else if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) { 1272d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta EmitGlobalConstantArray(CVA , AddrSpace); 12731b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12741b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } else if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) { 1275c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantStruct(CVS, AddrSpace); 12761b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12771b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) { 1278c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantFP(CFP, AddrSpace); 127900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 128000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 128100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Small integers are handled below; large integers are handled here. 128200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (Size > 4) { 1283c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantLargeInt(CI, AddrSpace); 12841b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12851b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 12869d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer } else if (const ConstantVector *CP = dyn_cast<ConstantVector>(CV)) { 128700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitGlobalConstantVector(CP); 12888cfa57b1b4eade4e0101195b2f94ab288cd03563Nate Begeman return; 12891b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 12901b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 1291c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta printDataDirective(type, AddrSpace); 129225045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(CV); 1293f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) { 1294f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1295f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng SmallString<40> S; 1296f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng CI->getValue().toStringUnsigned(S, 16); 1297f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << "\t\t\t" << TAI->getCommentString() << " 0x" << S.c_str(); 1298f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng } 1299eefc845b5f407adf1992602aaac1142b2d583220Scott Michel } 1300d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 13011b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner} 13020264d1a4777370009176157b76d116b3195e3767Chris Lattner 1303fad86b003a839cef40ec8ce8408322f4913368caChris Lattnervoid AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1304d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng // Target doesn't support this yet! 1305c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Target does not support EmitMachineConstantPoolValue"); 1306d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 1307d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 13083ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// PrintSpecial - Print information related to the specified machine instr 13093ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// that is independent of the operand, and may be independent of the instr 13103ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// itself. This can be useful for portably encoding the comment character 13113ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// or other bits of target-specific knowledge into the asmstrings. The 13123ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// syntax used is ${:comment}. Targets can override this to add support 13133ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// for their own strange codes. 13143e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattnervoid AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const { 1315bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner if (!strcmp(Code, "private")) { 1316bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner O << TAI->getPrivateGlobalPrefix(); 1317bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner } else if (!strcmp(Code, "comment")) { 1318f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1319f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getCommentString(); 13203ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } else if (!strcmp(Code, "uid")) { 1321b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner // Comparing the address of MI isn't sufficient, because machineinstrs may 1322b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner // be allocated to the same address across functions. 1323b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner const Function *ThisF = MI->getParent()->getParent()->getFunction(); 1324b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner 1325bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson // If this is a new LastFn instruction, bump the counter. 1326bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson if (LastMI != MI || LastFn != ThisF) { 1327b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner ++Counter; 1328b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner LastMI = MI; 1329bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson LastFn = ThisF; 1330b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner } 13313ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner O << Counter; 13323ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } else { 13337d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin std::string msg; 13347d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin raw_string_ostream Msg(msg); 13357d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin Msg << "Unknown special formatter '" << Code 1336e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling << "' for machine instr: " << *MI; 13377d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error(Msg.str()); 13383ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } 13393ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner} 13403ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1341cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis/// processDebugLoc - Processes the debug information of each machine 1342cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis/// instruction's DebugLoc. 1343cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidisvoid AsmPrinter::processDebugLoc(DebugLoc DL) { 1344cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis if (TAI->doesSupportDebugInformation() && DW->ShouldEmitDwarfDebug()) { 1345cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis if (!DL.isUnknown()) { 1346cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis DebugLocTuple CurDLT = MF->getDebugLocTuple(DL); 1347cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis 1348cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis if (CurDLT.CompileUnit != 0 && PrevDLT != CurDLT) 1349cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis printLabel(DW->RecordSourceLine(CurDLT.Line, CurDLT.Col, 1350cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis DICompileUnit(CurDLT.CompileUnit))); 1351cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis 1352cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis PrevDLT = CurDLT; 1353cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis } 1354cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis } 1355cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis} 13563ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 13570264d1a4777370009176157b76d116b3195e3767Chris Lattner/// printInlineAsm - This method formats and prints the specified machine 13580264d1a4777370009176157b76d116b3195e3767Chris Lattner/// instruction that is an inline asm. 13590264d1a4777370009176157b76d116b3195e3767Chris Lattnervoid AsmPrinter::printInlineAsm(const MachineInstr *MI) const { 1360f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner unsigned NumOperands = MI->getNumOperands(); 1361f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner 1362f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner // Count the number of register definitions. 1363f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner unsigned NumDefs = 0; 1364d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef(); 136567942f5dc30be1810f983aba8c94c49ca44e8634Chris Lattner ++NumDefs) 1366f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner assert(NumDefs != NumOperands-1 && "No asm string?"); 1367f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner 1368d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(MI->getOperand(NumDefs).isSymbol() && "No asm string?"); 13696609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 13706609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Disassemble the AsmStr, printing out the literal pieces, the operands, etc. 1371f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner const char *AsmStr = MI->getOperand(NumDefs).getSymbolName(); 13726609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1373ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen // If this asmstr is empty, just print the #APP/#NOAPP markers. 1374ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen // These are useful to see where empty asm's wound up. 1375f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner if (AsmStr[0] == 0) { 1376d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getInlineAsmStart() << "\n\t" << TAI->getInlineAsmEnd() << '\n'; 1377f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner return; 1378f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner } 1379f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner 1380563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getInlineAsmStart() << "\n\t"; 1381f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner 1382eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling // The variant of the current asmprinter. 1383eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling int AsmPrinterVariant = TAI->getAssemblerDialect(); 1384eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling 13856609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner int CurVariant = -1; // The number of the {.|.|.} region we are in. 13866609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *LastEmitted = AsmStr; // One past the last character emitted. 13872cc2f66c25d9576743026688fdae5ed402726532Chris Lattner 13886609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner while (*LastEmitted) { 13896609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner switch (*LastEmitted) { 13906609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner default: { 13916609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Not a special case, emit the string section literally. 13926609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *LiteralEnd = LastEmitted+1; 13936609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner while (*LiteralEnd && *LiteralEnd != '{' && *LiteralEnd != '|' && 13941c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner *LiteralEnd != '}' && *LiteralEnd != '$' && *LiteralEnd != '\n') 13956609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LiteralEnd; 13966609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 13976609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner O.write(LastEmitted, LiteralEnd-LastEmitted); 13986609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner LastEmitted = LiteralEnd; 13996609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 14006609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14011c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner case '\n': 14021c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner ++LastEmitted; // Consume newline character. 1403d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; // Indent code with newline. 14041c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner break; 14056609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner case '$': { 14066609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '$' character. 1407faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner bool Done = true; 1408faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner 1409faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner // Handle escapes. 1410faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner switch (*LastEmitted) { 1411faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner default: Done = false; break; 1412faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '$': // $$ -> $ 14136609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 14146609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner O << '$'; 14156609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume second '$' character. 14166609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 1417faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '(': // $( -> same as GCC's { character. 1418faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // Consume '(' character. 1419faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner if (CurVariant != -1) { 14207d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Nested variants found in inline asm string: '" 14217d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 1422faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner } 1423faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner CurVariant = 0; // We're in the first variant now. 1424faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 1425faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '|': 1426faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // consume '|' character. 14278b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen if (CurVariant == -1) 14288b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen O << '|'; // this is gcc's behavior for | outside a variant 14298b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen else 14308b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen ++CurVariant; // We're in the next variant. 1431faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 1432faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case ')': // $) -> same as GCC's } char. 1433faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // consume ')' character. 14348b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen if (CurVariant == -1) 14358b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen O << '}'; // this is gcc's behavior for } outside a variant 14368b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen else 14378b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen CurVariant = -1; 1438faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 14396609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1440faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner if (Done) break; 14416609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 14426609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner bool HasCurlyBraces = false; 14436609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (*LastEmitted == '{') { // ${variable} 14446609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '{' character. 14456609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner HasCurlyBraces = true; 14466609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14476609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 14483e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // If we have ${:foo}, then this is not a real operand reference, it is a 14493e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // "magic" string reference, just like in .td files. Arrange to call 14503e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // PrintSpecial. 14513e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner if (HasCurlyBraces && *LastEmitted == ':') { 14523e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner ++LastEmitted; 14533e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner const char *StrStart = LastEmitted; 14543e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner const char *StrEnd = strchr(StrStart, '}'); 14553e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner if (StrEnd == 0) { 14567d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Unterminated ${:foo} operand in inline asm string: '" 14577d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 14583e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner } 14593e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner 14603e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner std::string Val(StrStart, StrEnd); 14613e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner PrintSpecial(MI, Val.c_str()); 14623e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner LastEmitted = StrEnd+1; 14633e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner break; 14643e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner } 14653e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner 14666609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *IDStart = LastEmitted; 14676609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner char *IDEnd; 1468fad2912522a4c97128d8afcc2f40ca0e39287ddbChris Lattner errno = 0; 14696609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner long Val = strtol(IDStart, &IDEnd, 10); // We only accept numbers for IDs. 14706609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (!isdigit(*IDStart) || (Val == 0 && errno == EINVAL)) { 14717d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad $ operand number in inline asm string: '" 14727d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 14736609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14746609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner LastEmitted = IDEnd; 14756609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1476a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner char Modifier[2] = { 0, 0 }; 1477a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 14786609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (HasCurlyBraces) { 1479a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner // If we have curly braces, check for a modifier character. This 1480a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner // supports syntax like ${0:u}, which correspond to "%u0" in GCC asm. 1481a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner if (*LastEmitted == ':') { 1482a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner ++LastEmitted; // Consume ':' character. 1483a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner if (*LastEmitted == 0) { 14847d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad ${:} expression in inline asm string: '" 14857d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 1486a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner } 1487a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 1488a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner Modifier[0] = *LastEmitted; 1489a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner ++LastEmitted; // Consume modifier character. 1490a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner } 1491a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 14926609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (*LastEmitted != '}') { 14937d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad ${} expression in inline asm string: '" 14947d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 14956609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14966609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '}' character. 14976609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14986609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 14996609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if ((unsigned)Val >= NumOperands-1) { 15007d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Invalid $ operand number in inline asm string: '" 15017d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 15026609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15036609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1504c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner // Okay, we finally have a value number. Ask the target to print this 15056609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // operand! 1506c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) { 1507c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner unsigned OpNo = 1; 1508fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1509fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner bool Error = false; 1510fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1511c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner // Scan to find the machine operand number for the operand. 1512daf6bc6347b4785102611bdf21c512e8a7678cceChris Lattner for (; Val; --Val) { 1513fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner if (OpNo >= MI->getNumOperands()) break; 15149e3304900ff69c4920fea7369c9c36916c4a6a6aChris Lattner unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1515697cbbfb00c318f98d6eb51945f077e2bfe8781eEvan Cheng OpNo += InlineAsm::getNumOperandRegisters(OpFlags) + 1; 1516daf6bc6347b4785102611bdf21c512e8a7678cceChris Lattner } 1517fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1518fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner if (OpNo >= MI->getNumOperands()) { 1519fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner Error = true; 1520dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner } else { 15219e3304900ff69c4920fea7369c9c36916c4a6a6aChris Lattner unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1522fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner ++OpNo; // Skip over the ID number. 1523fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1524eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen if (Modifier[0]=='l') // labels are target independent 15258aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner printBasicBlockLabel(MI->getOperand(OpNo).getMBB(), 1526fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng false, false, false); 1527eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen else { 1528eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen AsmPrinter *AP = const_cast<AsmPrinter*>(this); 152986b49f8e2de796cb46c7c8b6a4c4900533fd53f4Dale Johannesen if ((OpFlags & 7) == 4) { 1530eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, 1531eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Modifier[0] ? Modifier : 0); 1532eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen } else { 1533eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, 1534eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Modifier[0] ? Modifier : 0); 1535eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen } 1536fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner } 1537dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner } 1538dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner if (Error) { 15397d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin std::string msg; 15407d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin raw_string_ostream Msg(msg); 15417d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin Msg << "Invalid operand found in inline asm: '" 1542e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling << AsmStr << "'\n"; 15437d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin MI->print(Msg); 15447d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error(Msg.str()); 15456609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1546c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner } 15476609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 15486609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15496609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15506609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1551d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << "\n\t" << TAI->getInlineAsmEnd() << '\n'; 15526609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner} 15536609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1554da47e6e0d003c873da960361549e57ee4617c301Evan Cheng/// printImplicitDef - This method prints the specified machine instruction 1555da47e6e0d003c873da960361549e57ee4617c301Evan Cheng/// that is an implicit def. 1556da47e6e0d003c873da960361549e57ee4617c301Evan Chengvoid AsmPrinter::printImplicitDef(const MachineInstr *MI) const { 1557f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1558f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " implicit-def: " 1559f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << TRI->getAsmName(MI->getOperand(0).getReg()) << '\n'; 1560da47e6e0d003c873da960361549e57ee4617c301Evan Cheng} 1561da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 15621ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey/// printLabel - This method prints a local label used by debug and 15631ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey/// exception handling tables. 15641ee29257428960fede862fcfdbe80d5d007927e9Jim Laskeyvoid AsmPrinter::printLabel(const MachineInstr *MI) const { 1565528bc028774513ee76125f85ceb8f704f5901cc8Dan Gohman printLabel(MI->getOperand(0).getImm()); 15661ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey} 15671ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey 15681b08bbca5592351a940bcd164bdec724ee954326Evan Chengvoid AsmPrinter::printLabel(unsigned Id) const { 15694eecdeb3faf5df864790175da5d58301b751ec11Evan Cheng O << TAI->getPrivateGlobalPrefix() << "label" << Id << ":\n"; 15701b08bbca5592351a940bcd164bdec724ee954326Evan Cheng} 15711b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 1572a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng/// printDeclare - This method prints a local variable declaration used by 1573a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng/// debug tables. 15744e3f5a4e9c13f216856515e6f000881f2c850736Evan Cheng/// FIXME: It doesn't really print anything rather it inserts a DebugVariable 15754e3f5a4e9c13f216856515e6f000881f2c850736Evan Cheng/// entry into dwarf table. 1576a844bdeab31ef04221e7ef59a8467893584cc14dEvan Chengvoid AsmPrinter::printDeclare(const MachineInstr *MI) const { 1577c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel unsigned FI = MI->getOperand(0).getIndex(); 15784e3f5a4e9c13f216856515e6f000881f2c850736Evan Cheng GlobalValue *GV = MI->getOperand(1).getGlobal(); 15791be3eccecbd2fa50ed9008ffee01f6351df5d8f7Devang Patel DW->RecordVariable(cast<GlobalVariable>(GV), FI, MI); 1580a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng} 1581a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 15826609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 15836609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// instruction, using the specified assembler variant. Targets should 15846609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// overried this to format as appropriate. 15856609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattnerbool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 1586a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner unsigned AsmVariant, const char *ExtraCode) { 15876609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Target doesn't support this yet! 15886609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner return true; 15890264d1a4777370009176157b76d116b3195e3767Chris Lattner} 1590dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner 1591dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattnerbool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 1592dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner unsigned AsmVariant, 1593dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner const char *ExtraCode) { 1594dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner // Target doesn't support this yet! 1595dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner return true; 1596dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner} 159737efe6764568a3829fee26aba532283131d1a104Nate Begeman 159837efe6764568a3829fee26aba532283131d1a104Nate Begeman/// printBasicBlockLabel - This method prints the label for the specified 159937efe6764568a3829fee26aba532283131d1a104Nate Begeman/// MachineBasicBlock 1600cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begemanvoid AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB, 1601fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool printAlign, 1602cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printColon, 1603cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printComment) const { 1604fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng if (printAlign) { 1605fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng unsigned Align = MBB->getAlignment(); 1606fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng if (Align) 1607fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng EmitAlignment(Log2_32(Align)); 1608fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng } 1609fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 1610d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getPrivateGlobalPrefix() << "BB" << getFunctionNumber() << '_' 1611347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << MBB->getNumber(); 1612cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman if (printColon) 1613cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman O << ':'; 16149c78ecb511ba6c8f53579ce60bcc4ef782eb831cChris Lattner if (printComment && MBB->getBasicBlock()) 1615286d56935c671a7d3fbf109828768618b97c5673Dan Gohman O << '\t' << TAI->getCommentString() << ' ' 161677c8f7674db1a3c57fa9d8916957a01f9961ef9cEvan Cheng << MBB->getBasicBlock()->getNameStart(); 161737efe6764568a3829fee26aba532283131d1a104Nate Begeman} 161852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 1619cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng/// printPICJumpTableSetLabel - This method prints a set label for the 1620cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng/// specified MachineBasicBlock for a jumptable entry. 1621cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Chengvoid AsmPrinter::printPICJumpTableSetLabel(unsigned uid, 1622cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const { 1623563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (!TAI->getSetDirective()) 162452a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman return; 162552a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 1626563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() 1627347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ','; 1628fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 1629347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1630347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << uid << '\n'; 163152a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman} 1632d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 1633cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Chengvoid AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 1634cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const { 163541349c10cbb166c58a20896e4761455f001c611eEvan Cheng if (!TAI->getSetDirective()) 163641349c10cbb166c58a20896e4761455f001c611eEvan Cheng return; 163741349c10cbb166c58a20896e4761455f001c611eEvan Cheng 163841349c10cbb166c58a20896e4761455f001c611eEvan Cheng O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() 1639347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << getFunctionNumber() << '_' << uid << '_' << uid2 1640347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << "_set_" << MBB->getNumber() << ','; 1641fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 1642347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1643347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << uid << '_' << uid2 << '\n'; 164441349c10cbb166c58a20896e4761455f001c611eEvan Cheng} 164541349c10cbb166c58a20896e4761455f001c611eEvan Cheng 1646d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng/// printDataDirective - This method prints the asm directive for the 1647d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng/// specified type. 1648c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) { 1649d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng const TargetData *TD = TM.getTargetData(); 1650d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng switch (type->getTypeID()) { 1651a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer case Type::IntegerTyID: { 1652a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer unsigned BitWidth = cast<IntegerType>(type)->getBitWidth(); 1653a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer if (BitWidth <= 8) 1654c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData8bitsDirective(AddrSpace); 1655a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 16) 1656c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData16bitsDirective(AddrSpace); 1657a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 32) 1658c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData32bitsDirective(AddrSpace); 1659a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 64) { 1660c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta assert(TAI->getData64bitsDirective(AddrSpace) && 1661a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer "Target cannot handle 64-bit constant exprs!"); 1662c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData64bitsDirective(AddrSpace); 166382f94f1ad98fdcc90e44053437fa555d339a4449Dan Gohman } else { 1664c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Target cannot handle given data directive width!"); 1665a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } 1666d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng break; 1667a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } 1668d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng case Type::PointerTyID: 1669d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng if (TD->getPointerSize() == 8) { 1670c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta assert(TAI->getData64bitsDirective(AddrSpace) && 1671d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng "Target cannot handle 64-bit pointer exprs!"); 1672c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData64bitsDirective(AddrSpace); 1673fcc6f1556efb386af47293d9f8599bab2b34321cSanjiv Gupta } else if (TD->getPointerSize() == 2) { 1674c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData16bitsDirective(AddrSpace); 1675fcc6f1556efb386af47293d9f8599bab2b34321cSanjiv Gupta } else if (TD->getPointerSize() == 1) { 1676c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData8bitsDirective(AddrSpace); 1677a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } else { 1678c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData32bitsDirective(AddrSpace); 1679d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 1680d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng break; 1681d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng case Type::FloatTyID: case Type::DoubleTyID: 16824292d1c02a6f10eca22aa6e27d57ea8bf15b3140Dale Johannesen case Type::X86_FP80TyID: case Type::FP128TyID: case Type::PPC_FP128TyID: 1683d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng assert (0 && "Should have already output floating point constant."); 1684d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng default: 1685d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng assert (0 && "Can't handle printing this type of thing"); 1686d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng break; 1687d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 1688d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 16894c3a5f8ccba6680b948a1a234f123b4505e43529Dale Johannesen 1690ab8faba2fb17e540751adf75161a25b18c94b818Evan Chengvoid AsmPrinter::printSuffixedName(const char *Name, const char *Suffix, 1691ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng const char *Prefix) { 1692c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen if (Name[0]=='\"') 1693ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng O << '\"'; 1694ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng O << TAI->getPrivateGlobalPrefix(); 1695ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng if (Prefix) O << Prefix; 1696ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng if (Name[0]=='\"') 1697ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng O << '\"'; 1698ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng if (Name[0]=='\"') 1699ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng O << Name[1]; 1700c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen else 1701ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng O << Name; 1702ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng O << Suffix; 1703ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng if (Name[0]=='\"') 1704ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng O << '\"'; 1705c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen} 170677c8f7674db1a3c57fa9d8916957a01f9961ef9cEvan Cheng 1707ab8faba2fb17e540751adf75161a25b18c94b818Evan Chengvoid AsmPrinter::printSuffixedName(const std::string &Name, const char* Suffix) { 170877c8f7674db1a3c57fa9d8916957a01f9961ef9cEvan Cheng printSuffixedName(Name.c_str(), Suffix); 170977c8f7674db1a3c57fa9d8916957a01f9961ef9cEvan Cheng} 1710f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov 1711f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikovvoid AsmPrinter::printVisibility(const std::string& Name, 1712f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov unsigned Visibility) const { 1713f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov if (Visibility == GlobalValue::HiddenVisibility) { 1714f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov if (const char *Directive = TAI->getHiddenDirective()) 1715f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov O << Directive << Name << '\n'; 1716f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov } else if (Visibility == GlobalValue::ProtectedVisibility) { 1717f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov if (const char *Directive = TAI->getProtectedDirective()) 1718f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov O << Directive << Name << '\n'; 1719f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov } 1720f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov} 1721c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 17227751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikovvoid AsmPrinter::printOffset(int64_t Offset) const { 17237751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov if (Offset > 0) 17247751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov O << '+' << Offset; 17257751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov else if (Offset < 0) 17267751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov O << Offset; 17277751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov} 17287751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov 17295eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenGCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) { 17305eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (!S->usesMetadata()) 1731c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen return 0; 1732c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 17335eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen gcp_iterator GCPI = GCMetadataPrinters.find(S); 1734c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen if (GCPI != GCMetadataPrinters.end()) 1735c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen return GCPI->second; 1736c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 17375eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *Name = S->getName().c_str(); 1738c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 1739c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen for (GCMetadataPrinterRegistry::iterator 1740c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen I = GCMetadataPrinterRegistry::begin(), 1741c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen E = GCMetadataPrinterRegistry::end(); I != E; ++I) 1742c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen if (strcmp(Name, I->getName()) == 0) { 17435eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GMP = I->instantiate(); 17445eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GMP->S = S; 17455eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinters.insert(std::make_pair(S, GMP)); 17465eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen return GMP; 1747c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen } 1748c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 17495eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen cerr << "no GCMetadataPrinter registered for GC: " << Name << "\n"; 1750c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable(0); 1751c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen} 1752014700c1a8cba203fd21ff129426ba8a426ab244David Greene 1753014700c1a8cba203fd21ff129426ba8a426ab244David Greene/// EmitComments - Pretty-print comments for instructions 1754014700c1a8cba203fd21ff129426ba8a426ab244David Greenevoid AsmPrinter::EmitComments(const MachineInstr &MI) const 1755014700c1a8cba203fd21ff129426ba8a426ab244David Greene{ 1756014700c1a8cba203fd21ff129426ba8a426ab244David Greene // No comments in MachineInstr yet 1757014700c1a8cba203fd21ff129426ba8a426ab244David Greene} 1758014700c1a8cba203fd21ff129426ba8a426ab244David Greene 1759014700c1a8cba203fd21ff129426ba8a426ab244David Greene/// EmitComments - Pretty-print comments for instructions 1760014700c1a8cba203fd21ff129426ba8a426ab244David Greenevoid AsmPrinter::EmitComments(const MCInst &MI) const 1761014700c1a8cba203fd21ff129426ba8a426ab244David Greene{ 1762014700c1a8cba203fd21ff129426ba8a426ab244David Greene // No comments in MCInst yet 1763014700c1a8cba203fd21ff129426ba8a426ab244David Greene} 1764