AsmPrinter.cpp revision 67e59834fc1dca7e357c40af2e5144f3d62f5133
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" 253ac1ab835caacdeebbd0d7b4d69160f283928d21David Greene#include "llvm/MC/MCInst.h" 2642bf74be1402df7409efbea089310d4c276fde37Evan Cheng#include "llvm/Support/CommandLine.h" 277d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/ErrorHandling.h" 28014700c1a8cba203fd21ff129426ba8a426ab244David Greene#include "llvm/Support/FormattedStream.h" 29a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#include "llvm/Support/Mangler.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; 4671847813bc419f7a0667468136a07429c6d9f164David GreeneAsmPrinter::AsmPrinter(formatted_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) { 1564cef584860acbde1d71157564e0d5f6f935b38a6Bill Wendling Mang = new Mangler(M, TAI->getGlobalPrefix(), TAI->getPrivateGlobalPrefix(), 15790f8b7073dd472afb21bc33be0f24391e7a4505bChris Lattner TAI->getLinkerPrivateGlobalPrefix()); 1582c1b1597f244c836771b4f2668c0ae399d32a5e9Chris Lattner 159a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner if (TAI->doesAllowQuotesInName()) 160a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner Mang->setUseQuotes(true); 161a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner 1621465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 1635eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 164952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola 165952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola if (TAI->hasSingleParameterDotFile()) { 166952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola /* Very minimal debug info. It is ignored if we emit actual 167952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola debug info. If we don't, this at helps the user find where 168952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola a function came from. */ 169952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola O << "\t.file\t\"" << M.getModuleIdentifier() << "\"\n"; 170952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola } 171952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola 1725eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen for (GCModuleInfo::iterator I = MI->begin(), E = MI->end(); I != E; ++I) 1735eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I)) 1745eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen MP->beginAssembly(O, *this, *TAI); 175ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 1763e2fa7a746270452316523f27b9055b007feba32Chris Lattner if (!M.getModuleInlineAsm().empty()) 177563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getCommentString() << " Start of file scope inline assembly\n" 1783e2fa7a746270452316523f27b9055b007feba32Chris Lattner << M.getModuleInlineAsm() 179d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman << '\n' << TAI->getCommentString() 180563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey << " End of file scope inline assembly\n"; 1812c1b1597f244c836771b4f2668c0ae399d32a5e9Chris Lattner 182ab4022f196059745c0ca0780b71a80fa67e896beAnton Korobeynikov SwitchToDataSection(""); // Reset back to no section. 183b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1840de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner if (TAI->doesSupportDebugInformation() || 1850de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner TAI->doesSupportExceptionHandling()) { 1860de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner MMI = getAnalysisIfAvailable<MachineModuleInfo>(); 1870de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner if (MMI) 18814a55d952cf238fff42da53a75f39cf06dab184bDevang Patel MMI->AnalyzeModule(M); 1890de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW = getAnalysisIfAvailable<DwarfWriter>(); 1900de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner if (DW) 1910de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW->BeginModule(&M, MMI, O, this, TAI); 19214a55d952cf238fff42da53a75f39cf06dab184bDevang Patel } 19314a55d952cf238fff42da53a75f39cf06dab184bDevang Patel 194a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner return false; 195a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 196a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 197a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnerbool AsmPrinter::doFinalization(Module &M) { 19840bbebde9d250b875a47a688d0c6552834ada48fChris Lattner // Emit global variables. 19940bbebde9d250b875a47a688d0c6552834ada48fChris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 20040bbebde9d250b875a47a688d0c6552834ada48fChris Lattner I != E; ++I) 20140bbebde9d250b875a47a688d0c6552834ada48fChris Lattner PrintGlobalVariable(I); 20240bbebde9d250b875a47a688d0c6552834ada48fChris Lattner 2031f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner // Emit final debug information. 2041f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner if (TAI->doesSupportDebugInformation() || TAI->doesSupportExceptionHandling()) 2051f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner DW->EndModule(); 2061f522feabf25134249bc7894e04f5b89fa071b7fChris Lattner 2070a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // If the target wants to know about weak references, print them all. 20815404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola if (TAI->getWeakRefDirective()) { 2090a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // FIXME: This is not lazy, it would be nice to only print weak references 2100a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // to stuff that is actually used. Note that doing so would require targets 2110a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // to notice uses in operands (due to constant exprs etc). This should 2120a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // happen with the MC stuff eventually. 2130a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner SwitchToDataSection(""); 2140a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner 2150a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner // Print out module-level global variables here. 2160a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); 2170a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 2180a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner if (I->hasExternalWeakLinkage()) 219b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner O << TAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n'; 2200a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner } 2210a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner 2220a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner for (Module::const_iterator I = M.begin(), E = M.end(); 2230a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 2240a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner if (I->hasExternalWeakLinkage()) 225b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner O << TAI->getWeakRefDirective() << Mang->getMangledName(I) << '\n'; 2260a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner } 22715404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola } 22815404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola 2298b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov if (TAI->getSetDirective()) { 230a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov if (!M.alias_empty()) 231d7ca416d6c9ae1966e0df8193112e3c5f430a053Anton Korobeynikov SwitchToSection(TAI->getTextSection()); 2328b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 233d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 2348b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov for (Module::const_alias_iterator I = M.alias_begin(), E = M.alias_end(); 2350a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner I != E; ++I) { 236b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner std::string Name = Mang->getMangledName(I); 237325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov 238325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov const GlobalValue *GV = cast<GlobalValue>(I->getAliasedGlobal()); 239b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner std::string Target = Mang->getMangledName(GV); 240541af7f769c89de8a7f52d563cf317ad7a86c245Anton Korobeynikov 241325be7c608a37d87e4f3d731e11fa3dd34f529b5Anton Korobeynikov if (I->hasExternalLinkage() || !TAI->getWeakRefDirective()) 242d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << "\t.globl\t" << Name << '\n'; 2438b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov else if (I->hasWeakLinkage()) 244d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getWeakRefDirective() << Name << '\n'; 245bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola else if (!I->hasLocalLinkage()) 246c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Invalid alias linkage"); 24722c9e65643e0c6b43be37a19e59491ef0081092cAnton Korobeynikov 248541af7f769c89de8a7f52d563cf317ad7a86c245Anton Korobeynikov printVisibility(Name, I->getVisibility()); 24922c9e65643e0c6b43be37a19e59491ef0081092cAnton Korobeynikov 250d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getSetDirective() << ' ' << Name << ", " << Target << '\n'; 2518b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov } 2528b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov } 2538b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov 2541465d61bdd36cfd6021036a527895f0dd358e97dDuncan Sands GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>(); 2555eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen assert(MI && "AsmPrinter didn't require GCModuleInfo?"); 2565eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; ) 2575eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*--I)) 2585eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen MP->finishAssembly(O, *this, *TAI); 259ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 260a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman // If we don't have any trampolines, then we don't require stack memory 261a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman // to be executable. Some targets have a directive to declare this. 2620a7befa8bd56621f51eaf9196417b866962bf7b1Chris Lattner Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline"); 263a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty()) 264a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman if (TAI->getNonexecutableStackDirective()) 265d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getNonexecutableStackDirective() << '\n'; 266a779a9899a5e23bd5198973f4709d66cb4bc2e64Dan Gohman 267a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner delete Mang; Mang = 0; 2680de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner DW = 0; MMI = 0; 269a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner return false; 270a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 271a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 272e2cf37b88c089a71727b3ecd466856f0cd638813Chris Lattnerstd::string 273e2cf37b88c089a71727b3ecd466856f0cd638813Chris LattnerAsmPrinter::getCurrentFunctionEHName(const MachineFunction *MF) const { 2746e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling assert(MF && "No machine function?"); 275e2cf37b88c089a71727b3ecd466856f0cd638813Chris Lattner return Mang->getMangledName(MF->getFunction(), ".eh", 276e2cf37b88c089a71727b3ecd466856f0cd638813Chris Lattner TAI->is_EHSymbolPrivate()); 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 304298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner const TargetData &TD = *TM.getTargetData(); 305298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner 306088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // Calculate sections for constant pool entries. We collect entries to go into 307088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // the same section together to reduce amount of section switch statements. 3081606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SmallVector<SectionCPs, 4> CPSections; 3092d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng for (unsigned i = 0, e = CP.size(); i != e; ++i) { 310298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner const MachineConstantPoolEntry &CPE = CP[i]; 3111606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Align = CPE.getAlignment(); 312298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner uint64_t Size = TD.getTypeAllocSize(CPE.getType()); 313298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner const Section *S = 314298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner TAI->getSectionForMergableConstant(Size, CPE.getRelocationInfo()); 315298414ec1891ce8d3a1b69e6019ad8765c8e69dcChris Lattner 3161606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // The number of sections are small, just do a linear search from the 3171606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // last section to the first. 3181606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng bool Found = false; 3191606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned SecIdx = CPSections.size(); 3201606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng while (SecIdx != 0) { 3211606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (CPSections[--SecIdx].S == S) { 3221606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng Found = true; 3231606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng break; 3241606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 3251606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 3261606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (!Found) { 3271606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SecIdx = CPSections.size(); 3281606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections.push_back(SectionCPs(S, Align)); 3291606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 3301606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3311606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (Align > CPSections[SecIdx].Alignment) 3321606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections[SecIdx].Alignment = Align; 3331606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng CPSections[SecIdx].CPEs.push_back(i); 3342d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng } 3352d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 336088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov // Now print stuff into the calculated sections. 3371606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng for (unsigned i = 0, e = CPSections.size(); i != e; ++i) { 3381606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng SwitchToSection(CPSections[i].S); 3391606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitAlignment(Log2_32(CPSections[i].Alignment)); 3402d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 3411606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned Offset = 0; 3421606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) { 3431606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned CPI = CPSections[i].CPEs[j]; 3441606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng MachineConstantPoolEntry CPE = CP[CPI]; 3451606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3461606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng // Emit inter-object padding for alignment. 3471606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned AlignMask = CPE.getAlignment() - 1; 3481606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng unsigned NewOffset = (Offset + AlignMask) & ~AlignMask; 3491606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitZeros(NewOffset - Offset); 3501606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng 3511606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng const Type *Ty = CPE.getType(); 352777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands Offset = NewOffset + TM.getTargetData()->getTypeAllocSize(Ty); 3532d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng 354088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_' 3551606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng << CPI << ":\t\t\t\t\t"; 3561606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (VerboseAsm) { 3571606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng O << TAI->getCommentString() << ' '; 3581606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng WriteTypeSymbolic(O, CPE.getType(), 0); 3591606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng } 360088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov O << '\n'; 3611606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng if (CPE.isMachineConstantPoolEntry()) 3621606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitMachineConstantPoolValue(CPE.Val.MachineCPVal); 363088ae8393f124564ca9ab70654645aa656e5646fAnton Korobeynikov else 3641606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng EmitGlobalConstant(CPE.Val.ConstVal); 3653029f920519e0871a5aad5d7c592281093953733Chris Lattner } 3663b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner } 3673b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner} 3683b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner 36937efe6764568a3829fee26aba532283131d1a104Nate Begeman/// EmitJumpTableInfo - Print assembly representations of the jump tables used 37037efe6764568a3829fee26aba532283131d1a104Nate Begeman/// by the current function to the current output stream. 37137efe6764568a3829fee26aba532283131d1a104Nate Begeman/// 3721da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattnervoid AsmPrinter::EmitJumpTableInfo(MachineJumpTableInfo *MJTI, 3731da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner MachineFunction &MF) { 37437efe6764568a3829fee26aba532283131d1a104Nate Begeman const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables(); 37537efe6764568a3829fee26aba532283131d1a104Nate Begeman if (JT.empty()) return; 3769de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 377acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 3784d9bbdc4408cc871d229677313cc4887862719d7Nate Begeman 3792f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman // Pick the directive to use to print the jump table entries, and switch to 3802f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman // the appropriate section. 381acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey TargetLowering *LoweringInfo = TM.getTargetLowering(); 38224287ddb81aca5d2579dc30ebd3528d2521529d7Anton Korobeynikov 383e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov const char* JumpTableDataSection = TAI->getJumpTableDataSection(); 384e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov const Function *F = MF.getFunction(); 385e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov unsigned SectionFlags = TAI->SectionFlagsForGlobal(F); 386b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng bool JTInDiffSection = false; 38724287ddb81aca5d2579dc30ebd3528d2521529d7Anton Korobeynikov if ((IsPic && !(LoweringInfo && LoweringInfo->usesGlobalOffsetTable())) || 388b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng !JumpTableDataSection || 389e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov SectionFlags & SectionFlags::Linkonce) { 390acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey // In PIC mode, we need to emit the jump table to the same section as the 391acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey // function body itself, otherwise the label differences won't make sense. 392e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov // We should also do if the section name is NULL or function is declared in 393e87f52d722d4184becb2ecaf4500dd01d176bfc2Anton Korobeynikov // discardable section. 394c25e1ea5e9aa54952b6736a9579e25a5c2d8139fAnton Korobeynikov SwitchToSection(TAI->SectionForGlobal(F)); 3952f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman } else { 39624287ddb81aca5d2579dc30ebd3528d2521529d7Anton Korobeynikov SwitchToDataSection(JumpTableDataSection); 397b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng JTInDiffSection = true; 3982f1ae88445c696a9b9d61e14747ba721190cdc99Nate Begeman } 399acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey 400acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey EmitAlignment(Log2_32(MJTI->getAlignment())); 4010c4e6789da4dba6c7b0010886776b24dec3f3bb8Chris Lattner 40237efe6764568a3829fee26aba532283131d1a104Nate Begeman for (unsigned i = 0, e = JT.size(); i != e; ++i) { 40352a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman const std::vector<MachineBasicBlock*> &JTBBs = JT[i].MBBs; 40407371882208f913d18a7f2a47373eaee7138416bChris Lattner 40507371882208f913d18a7f2a47373eaee7138416bChris Lattner // If this jump table was deleted, ignore it. 40607371882208f913d18a7f2a47373eaee7138416bChris Lattner if (JTBBs.empty()) continue; 40752a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 40852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // For PIC codegen, if possible we want to use the SetDirective to reduce 40952a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // the number of relocations the assembler will generate for the jump table. 41052a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman // Set directives are all printed before the jump table itself. 411cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng SmallPtrSet<MachineBasicBlock*, 16> EmittedSets; 412acd80ac7bb19f8bdfa55336d567c9ecbe695c8b8Jim Laskey if (TAI->getSetDirective() && IsPic) 41352a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) 414cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng if (EmittedSets.insert(JTBBs[ii])) 415cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng printPICJumpTableSetLabel(i, JTBBs[ii]); 41652a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 417393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // On some targets (e.g. darwin) we want to emit two consequtive labels 418393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // before each jump table. The first label is never referenced, but tells 419393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // the assembler and linker the extents of the jump table object. The 420393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner // second label is actually referenced by the code. 421b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng if (JTInDiffSection) { 422b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng if (const char *JTLabelPrefix = TAI->getJumpTableSpecialLabelPrefix()) 423b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng O << JTLabelPrefix << "JTI" << getFunctionNumber() << '_' << i << ":\n"; 424b13bafe5c12dd908b55c559c93adaeb1627ed096Evan Cheng } 425393a8eea3c15de08eaf6953aa8a65a3961b76153Chris Lattner 426347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 427347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << i << ":\n"; 42852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 42937efe6764568a3829fee26aba532283131d1a104Nate Begeman for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) { 4309de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov printPICJumpTableEntry(MJTI, JTBBs[ii], i); 43137efe6764568a3829fee26aba532283131d1a104Nate Begeman O << '\n'; 43237efe6764568a3829fee26aba532283131d1a104Nate Begeman } 43337efe6764568a3829fee26aba532283131d1a104Nate Begeman } 43437efe6764568a3829fee26aba532283131d1a104Nate Begeman} 43537efe6764568a3829fee26aba532283131d1a104Nate Begeman 4369de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikovvoid AsmPrinter::printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 4379de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const MachineBasicBlock *MBB, 4389de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov unsigned uid) const { 4399de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov bool IsPic = TM.getRelocationModel() == Reloc::PIC_; 4409de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4419de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // Use JumpTableDirective otherwise honor the entry size from the jump table 4429de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // info. 4439de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const char *JTEntryDirective = TAI->getJumpTableDirective(); 4449de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov bool HadJTEntryDirective = JTEntryDirective != NULL; 4459de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (!HadJTEntryDirective) { 4469de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov JTEntryDirective = MJTI->getEntrySize() == 4 ? 4479de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov TAI->getData32bitsDirective() : TAI->getData64bitsDirective(); 4489de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4499de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4509de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov O << JTEntryDirective << ' '; 4519de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4529de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If we have emitted set directives for the jump table entries, print 4539de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // them rather than the entries themselves. If we're emitting PIC, then 4549de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // emit the table entries as differences between two text section labels. 4559de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If we're emitting non-PIC code, then emit the entries as direct 4569de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // references to the target basic blocks. 4579de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (IsPic) { 4589de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (TAI->getSetDirective()) { 4599de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov O << TAI->getPrivateGlobalPrefix() << getFunctionNumber() 4609de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov << '_' << uid << "_set_" << MBB->getNumber(); 4619de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } else { 462fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 4639de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // If the arch uses custom Jump Table directives, don't calc relative to 4649de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov // JT 4659de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov if (!HadJTEntryDirective) 4669de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" 4679de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov << getFunctionNumber() << '_' << uid; 4689de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4699de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } else { 470fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 4719de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov } 4729de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov} 4739de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 4749de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 475ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// EmitSpecialLLVMGlobal - Check to see if the specified global is a 476ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// special global used by LLVM. If so, emit it and return true, otherwise 477ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// do nothing and return false. 478ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattnerbool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) { 479401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner if (GV->isName("llvm.used")) { 480b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth if (TAI->getUsedDirective() != 0) // No need to emit this at all. 481b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth EmitLLVMUsedList(GV->getInitializer()); 482b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth return true; 483b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth } 484b753a9bb6277cd34ffc55f8674087ff8c3097a11Andrew Lenharth 485401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // Ignore debug and non-emitted data. This handles llvm.compiler.used. 486266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner if (GV->getSection() == "llvm.metadata" || 487266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner GV->hasAvailableExternallyLinkage()) 488266c7bbbbcc4b326dea82e577de1a415d6acc23eChris Lattner return true; 4897809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey 4907809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey if (!GV->hasAppendingLinkage()) return false; 4917809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey 4927809811e4ed3c2462efa327cef0464b9844baea2Jim Laskey assert(GV->hasInitializer() && "Not a special LLVM global!"); 493ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 494916d07cdfa89e77118043ec6e14575512ae1bf85Evan Cheng const TargetData *TD = TM.getTargetData(); 495916d07cdfa89e77118043ec6e14575512ae1bf85Evan Cheng unsigned Align = Log2_32(TD->getPointerPrefAlignment()); 496f231c07228deb75b6cd5ae7c9c057bc8303c6998Chris Lattner if (GV->getName() == "llvm.global_ctors") { 497ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner SwitchToDataSection(TAI->getStaticCtorsSection()); 498ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitAlignment(Align, 0); 499ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitXXStructorList(GV->getInitializer()); 500ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner return true; 501ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 502ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 503f231c07228deb75b6cd5ae7c9c057bc8303c6998Chris Lattner if (GV->getName() == "llvm.global_dtors") { 504ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner SwitchToDataSection(TAI->getStaticDtorsSection()); 505ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitAlignment(Align, 0); 506ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner EmitXXStructorList(GV->getInitializer()); 507ea3a9ff53d699bc22fcff52dbbce8aab6578a020Chris Lattner return true; 508ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 509ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 510ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner return false; 511ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner} 512ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 513cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner/// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each 514d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen/// global in the specified llvm.used list for which emitUsedDirectiveFor 515d2e51af0358b571367a9f1e5175b87e9dd72edf8Dale Johannesen/// is true, as being used with this directive. 516cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattnervoid AsmPrinter::EmitLLVMUsedList(Constant *List) { 517cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner const char *Directive = TAI->getUsedDirective(); 518cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 519a119de86a064414622562cfe32953de7f9b0ee40Dan Gohman // Should be an array of 'i8*'. 520cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner ConstantArray *InitList = dyn_cast<ConstantArray>(List); 521cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner if (InitList == 0) return; 522cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 523cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { 52416fe990e56102a355f1e77aca93bf8c79d7b9eb2Chris Lattner const GlobalValue *GV = 52516fe990e56102a355f1e77aca93bf8c79d7b9eb2Chris Lattner dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts()); 52616fe990e56102a355f1e77aca93bf8c79d7b9eb2Chris Lattner if (GV && TAI->emitUsedDirectiveFor(GV, Mang)) { 52761e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen O << Directive; 52861e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen EmitConstantValueOnly(InitList->getOperand(i)); 52961e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen O << '\n'; 53061e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen } 531cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner } 532cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner} 533cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner 534ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// EmitXXStructorList - Emit the ctor or dtor list. This just prints out the 535ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner/// function pointers, ignoring the init priority. 536ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattnervoid AsmPrinter::EmitXXStructorList(Constant *List) { 537ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner // Should be an array of '{ int, void ()* }' structs. The first value is the 538ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner // init priority, which we ignore. 539ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (!isa<ConstantArray>(List)) return; 540ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner ConstantArray *InitList = cast<ConstantArray>(List); 541ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 542ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (ConstantStruct *CS = dyn_cast<ConstantStruct>(InitList->getOperand(i))){ 543ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner if (CS->getNumOperands() != 2) return; // Not array of 2-element structs. 5448de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner 5458de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner if (CS->getOperand(1)->isNullValue()) 5468de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner return; // Found a null terminator, exit printing. 5478de324b59ce81cfb4202c706c96a3140f52e00c0Chris Lattner // Emit the function pointer. 548ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner EmitGlobalConstant(CS->getOperand(1)); 549ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner } 550ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner} 5513b4fd32a41a90ea67fd09a020d480c20e9c40dafChris Lattner 552a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey/// getGlobalLinkName - Returns the asm/link name of of the specified 553a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey/// global variable. Should be overridden by each target asm printer to 554a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey/// generate the appropriate value. 5557d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendlingconst std::string &AsmPrinter::getGlobalLinkName(const GlobalVariable *GV, 5567d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling std::string &LinkName) const { 5570374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey if (isa<Function>(GV)) { 5580374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getFunctionAddrPrefix(); 559b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner LinkName += Mang->getMangledName(GV); 5600374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getFunctionAddrSuffix(); 5610374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey } else { 5620374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getGlobalVarAddrPrefix(); 563b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner LinkName += Mang->getMangledName(GV); 5640374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey LinkName += TAI->getGlobalVarAddrSuffix(); 5650374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey } 5660374248e86f66231ff5f07e6bce14e3dd67abd14Jim Laskey 56799e41eed6d8b89b2ba4807625d13d08d85ea493dJim Laskey return LinkName; 568a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey} 569a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 570bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey/// EmitExternalGlobal - Emit the external reference to a global variable. 571bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey/// Should be overridden if an indirect reference should be used. 572bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskeyvoid AsmPrinter::EmitExternalGlobal(const GlobalVariable *GV) { 5737d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling std::string GLN; 5747d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling O << getGlobalLinkName(GV, GLN); 575bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey} 576bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 577bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 578bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 579f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===----------------------------------------------------------------------===// 580f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// LEB 128 number encoding. 581f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 582f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// PrintULEB128 - Print a series of hexidecimal values (separated by commas) 583f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// representing an unsigned leb128 value. 584f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintULEB128(unsigned Value) const { 585a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner char Buffer[20]; 586f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey do { 587a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 588f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey Value >>= 7; 589f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (Value) Byte |= 0x80; 590a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << "0x" << utohex_buffer(Byte, Buffer+20); 591f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (Value) O << ", "; 592f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } while (Value); 593f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 594f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 595f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// PrintSLEB128 - Print a series of hexidecimal values (separated by commas) 596f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// representing a signed leb128 value. 597f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintSLEB128(int Value) const { 598f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey int Sign = Value >> (8 * sizeof(Value) - 1); 599f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey bool IsMore; 600a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner char Buffer[20]; 601ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov 602f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey do { 603a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner unsigned char Byte = static_cast<unsigned char>(Value & 0x7f); 604f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey Value >>= 7; 605f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 606f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (IsMore) Byte |= 0x80; 607a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << "0x" << utohex_buffer(Byte, Buffer+20); 608f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (IsMore) O << ", "; 609f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } while (IsMore); 610f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 611f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 612f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===--------------------------------------------------------------------===// 613f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey// Emission and print routines 614f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey// 615f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 616f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// PrintHex - Print a value as a hexidecimal value. 617f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 618f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::PrintHex(int Value) const { 619c6a1346d7c6bb761f9e6c2c85b53febba1cb15dbChris Lattner char Buffer[20]; 620c6a1346d7c6bb761f9e6c2c85b53febba1cb15dbChris Lattner O << "0x" << utohex_buffer(static_cast<unsigned>(Value), Buffer+20); 621f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 622f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 623f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EOL - Print a newline character to asm stream. If a comment is present 624f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// then it will be printed first. Comments should not contain '\n'. 625bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskeyvoid AsmPrinter::EOL() const { 626d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 627bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey} 62825995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson 629f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EOL(const std::string &Comment) const { 6306547e406cf934346db7a206b61bcf09635afff0dEvan Cheng if (VerboseAsm && !Comment.empty()) { 631d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\t' 632f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << TAI->getCommentString() 633d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman << ' ' 634f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Comment; 635f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 636d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 637f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 638f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 63925995093e785f4794b3590f3df70fbfe834a00a1Owen Andersonvoid AsmPrinter::EOL(const char* Comment) const { 6406547e406cf934346db7a206b61bcf09635afff0dEvan Cheng if (VerboseAsm && *Comment) { 64125995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson O << '\t' 64225995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << TAI->getCommentString() 64325995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << ' ' 64425995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson << Comment; 64525995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson } 64625995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson O << '\n'; 64725995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson} 64825995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson 649f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 650f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// unsigned leb128 value. 651f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitULEB128Bytes(unsigned Value) const { 652f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TAI->hasLEB128()) { 653f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\t.uleb128\t" 654f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Value; 655f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 656f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData8bitsDirective(); 657f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintULEB128(Value); 658f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 659f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 660f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 661f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitSLEB128Bytes - print an assembler byte data directive to compose a 662f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// signed leb128 value. 663f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitSLEB128Bytes(int Value) const { 664f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TAI->hasLEB128()) { 665f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\t.sleb128\t" 666f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey << Value; 667f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 668f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData8bitsDirective(); 669f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintSLEB128(Value); 670f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 671f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 672f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 673f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt8 - Emit a byte directive and value. 674f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 675f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt8(int Value) const { 676f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData8bitsDirective(); 677f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value & 0xFF); 678f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 679f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 680f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt16 - Emit a short directive and value. 681f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 682f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt16(int Value) const { 683f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData16bitsDirective(); 684f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value & 0xFFFF); 685f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 686f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 687f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt32 - Emit a long directive and value. 688f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 689f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt32(int Value) const { 690f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData32bitsDirective(); 691f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value); 692f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 693f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 694f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitInt64 - Emit a long long directive and value. 695f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 696f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitInt64(uint64_t Value) const { 697f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TAI->getData64bitsDirective()) { 698f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << TAI->getData64bitsDirective(); 699f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey PrintHex(Value); 700f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 701f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (TM.getTargetData()->isBigEndian()) { 702d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman EmitInt32(unsigned(Value >> 32)); O << '\n'; 703f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey EmitInt32(unsigned(Value)); 704f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 705d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman EmitInt32(unsigned(Value)); O << '\n'; 706f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey EmitInt32(unsigned(Value >> 32)); 707f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 708f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 709f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 710f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 711f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// toOctal - Convert the low order bits of X into an octal digit. 712f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 713f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeystatic inline char toOctal(int X) { 714f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey return (X&7)+'0'; 715f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 716f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 717f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// printStringChar - Print a char, escaped if necessary. 718f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// 71971847813bc419f7a0667468136a07429c6d9f164David Greenestatic void printStringChar(formatted_raw_ostream &O, unsigned char C) { 720f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey if (C == '"') { 721f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\\\""; 722f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else if (C == '\\') { 723f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << "\\\\"; 724bbfa244b2fa986c53a1bcf38b6dd0fea082afaaaChris Lattner } else if (isprint((unsigned char)C)) { 725f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << C; 726f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } else { 727f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey switch(C) { 728f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\b': O << "\\b"; break; 729f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\f': O << "\\f"; break; 730f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\n': O << "\\n"; break; 731f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\r': O << "\\r"; break; 732f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey case '\t': O << "\\t"; break; 733f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey default: 734f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << '\\'; 735f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 6); 736f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 3); 737f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey O << toOctal(C >> 0); 738f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey break; 739f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 740f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey } 741f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 742f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 743f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// EmitString - Emit a string with quotes and a null terminator. 744f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// Special characters are emitted properly. 745f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey/// \literal (Eg. '\t') \endliteral 746f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskeyvoid AsmPrinter::EmitString(const std::string &String) const { 747f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling EmitString(String.c_str(), String.size()); 748f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling} 749f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling 750f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendlingvoid AsmPrinter::EmitString(const char *String, unsigned Size) const { 751fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov const char* AscizDirective = TAI->getAscizDirective(); 752fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov if (AscizDirective) 753fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << AscizDirective; 754fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov else 755fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << TAI->getAsciiDirective(); 756d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 757f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling for (unsigned i = 0; i < Size; ++i) 758a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner printStringChar(O, String[i]); 759fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov if (AscizDirective) 760d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 761fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov else 762fb269cf3e7893e1e5265db818e7ce78b6b2f75b5Anton Korobeynikov O << "\\0\""; 763f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey} 764f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 765f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 766189f80dc253664627253b2d2cb07d0714feb12baDan Gohman/// EmitFile - Emit a .file directive. 767189f80dc253664627253b2d2cb07d0714feb12baDan Gohmanvoid AsmPrinter::EmitFile(unsigned Number, const std::string &Name) const { 768189f80dc253664627253b2d2cb07d0714feb12baDan Gohman O << "\t.file\t" << Number << " \""; 769a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner for (unsigned i = 0, N = Name.size(); i < N; ++i) 770a118c2ee89842346ef2fd332c0fea6b931d79483Chris Lattner printStringChar(O, Name[i]); 771d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 772189f80dc253664627253b2d2cb07d0714feb12baDan Gohman} 773189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 774189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 775f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey//===----------------------------------------------------------------------===// 776f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 7773a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// EmitAlignment - Emit an alignment directive to the specified power of 7783a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// two boundary. For example, if you pass in 3 here, you will get an 8 7793a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// byte alignment. If a global value is specified, and if that global has 7803a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// an explicit alignment requested, it will unconditionally override the 7813a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// alignment request. However, if ForcedAlignBits is specified, this value 7823a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// has final say: the ultimate alignment will be the max of ForcedAlignBits 7833a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// and the alignment computed with NumBits and the global. 7843a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// 7853a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// The algorithm is: 7863a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// Align = NumBits; 7873a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// if (GV && GV->hasalignment) Align = GV->getalignment(); 7883a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// Align = std::max(Align, ForcedAlignBits); 7893a4205367dc845d4cd804b47e061f8281777c9daChris Lattner// 7903a4205367dc845d4cd804b47e061f8281777c9daChris Lattnervoid AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV, 79105548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits, 79205548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr) const { 79300d56b96e599acbc4f895e86e17029ae7c45f142Dale Johannesen if (GV && GV->getAlignment()) 7943a4205367dc845d4cd804b47e061f8281777c9daChris Lattner NumBits = Log2_32(GV->getAlignment()); 7953a4205367dc845d4cd804b47e061f8281777c9daChris Lattner NumBits = std::max(NumBits, ForcedAlignBits); 7963a4205367dc845d4cd804b47e061f8281777c9daChris Lattner 7972a21c6e86101c857d683e7bdefb775654ccab7e3Chris Lattner if (NumBits == 0) return; // No need to emit alignment. 798563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits; 79973a259a9d1814912255aee6c185c5aeb7bb581baEvan Cheng O << TAI->getAlignDirective() << NumBits; 800fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 801fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng unsigned FillValue = TAI->getTextAlignFillValue(); 80205548eb174dd694b651de334b73197a62e5071f1Evan Cheng UseFillExpr &= IsInTextSection && FillValue; 803a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner if (UseFillExpr) { 804a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner O << ','; 805a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner PrintHex(FillValue); 806a64f463fb90c66406033e3fd1dc912b648bad328Chris Lattner } 807d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 808bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner} 809bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 810bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 81125045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner/// EmitZeros - Emit a block of zeros. 8127d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner/// 813c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitZeros(uint64_t NumZeros, unsigned AddrSpace) const { 8147d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner if (NumZeros) { 815563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getZeroDirective()) { 816563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getZeroDirective() << NumZeros; 817563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getZeroDirectiveSuffix()) 818563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getZeroDirectiveSuffix(); 819d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 820c6a057b04db506152c98355b51ba15d82a15b90aJeff Cohen } else { 8217d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner for (; NumZeros; --NumZeros) 822c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData8bitsDirective(AddrSpace) << "0\n"; 8237d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner } 8247d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner } 8257d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner} 8267d057a3fd579a57d9f16a3e366b56df0aff4f486Chris Lattner 827a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// Print out the specified constant, without a storage class. Only the 828a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// constants valid in constant expressions can occur here. 82925045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattnervoid AsmPrinter::EmitConstantValueOnly(const Constant *CV) { 830bd1d382cc47dfc43ee758714bc22ab5a750bad15Chris Lattner if (CV->isNullValue() || isa<UndefValue>(CV)) 831d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '0'; 8326b6b6ef1677fa71b1072c2911b4c1f9524a558c9Zhou Sheng else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 8334315eee376450972d111c8e263ca8aecc7a3a13bScott Michel O << CI->getZExtValue(); 834b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV)) { 835855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // This is a constant address for a global variable or function. Use the 836855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // name of the variable or function as the address value, possibly 837855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // decorating it with GlobalVarAddrPrefix/Suffix or 838855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina // FunctionAddrPrefix/Suffix (these all default to "" ) 839563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (isa<Function>(GV)) { 840563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getFunctionAddrPrefix() 841b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner << Mang->getMangledName(GV) 842563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey << TAI->getFunctionAddrSuffix(); 843563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey } else { 844563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getGlobalVarAddrPrefix() 845b8158acc23f5f0bf235fb1c6a8182a38ec9b00b2Chris Lattner << Mang->getMangledName(GV) 846563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey << TAI->getGlobalVarAddrSuffix(); 847563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey } 848855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) { 849a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson const TargetData *TD = TM.getTargetData(); 85013b7d3d499ec63c5f417f7a7246afb77adb63b2eAnton Korobeynikov unsigned Opcode = CE->getOpcode(); 85113b7d3d499ec63c5f417f7a7246afb77adb63b2eAnton Korobeynikov switch (Opcode) { 852a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner case Instruction::GetElementPtr: { 853a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner // generate a symbolic expression for the byte address 854a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner const Constant *ptrVal = CE->getOperand(0); 8557f6b9d2f1a7d55f6a84a1e8078b895ce4ff66daeChris Lattner SmallVector<Value*, 8> idxVec(CE->op_begin()+1, CE->op_end()); 8567f6b9d2f1a7d55f6a84a1e8078b895ce4ff66daeChris Lattner if (int64_t Offset = TD->getIndexedOffset(ptrVal->getType(), &idxVec[0], 8577f6b9d2f1a7d55f6a84a1e8078b895ce4ff66daeChris Lattner idxVec.size())) { 8584798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner // Truncate/sext the offset to the pointer size. 8594798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner if (TD->getPointerSizeInBits() != 64) { 8604798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner int SExtAmount = 64-TD->getPointerSizeInBits(); 8614798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner Offset = (Offset << SExtAmount) >> SExtAmount; 8624798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner } 8634798bbeaf5a76a83f2aa923b0abc792e01ac3be7Chris Lattner 86427e192196fec42618c7fcbd865e8e0b541545671Chris Lattner if (Offset) 865d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '('; 86625045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(ptrVal); 86727e192196fec42618c7fcbd865e8e0b541545671Chris Lattner if (Offset > 0) 86827e192196fec42618c7fcbd865e8e0b541545671Chris Lattner O << ") + " << Offset; 86927e192196fec42618c7fcbd865e8e0b541545671Chris Lattner else if (Offset < 0) 87027e192196fec42618c7fcbd865e8e0b541545671Chris Lattner O << ") - " << -Offset; 871a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } else { 87225045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(ptrVal); 873a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 874a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner break; 875a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 8763da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::Trunc: 8773da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::ZExt: 8783da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::SExt: 8793da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPTrunc: 8803da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPExt: 8813da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::UIToFP: 8823da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::SIToFP: 8833da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPToUI: 8843da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer case Instruction::FPToSI: 885c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("FIXME: Don't yet support this kind of constant cast expr"); 8863da59db637a887474c1b1346c1f3ccf53b6c4663Reid Spencer break; 887cb0a6819895bf5e357a205b72f0a6fce90025f21Chris Lattner case Instruction::BitCast: 888cb0a6819895bf5e357a205b72f0a6fce90025f21Chris Lattner return EmitConstantValueOnly(CE->getOperand(0)); 889cb0a6819895bf5e357a205b72f0a6fce90025f21Chris Lattner 890ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner case Instruction::IntToPtr: { 891ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // Handle casts to pointers by changing them into casts to the appropriate 892ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // integer type. This promotes constant folding and simplifies this code. 893ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner Constant *Op = CE->getOperand(0); 894ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner Op = ConstantExpr::getIntegerCast(Op, TD->getIntPtrType(), false/*ZExt*/); 895ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner return EmitConstantValueOnly(Op); 896ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner } 897ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner 898ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner 899ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner case Instruction::PtrToInt: { 9004a6bd33da0e30c26568baf3ad6c94d1f497e5ea7Chris Lattner // Support only foldable casts to/from pointers that can be eliminated by 9014a6bd33da0e30c26568baf3ad6c94d1f497e5ea7Chris Lattner // changing the pointer to the appropriately sized integer type. 902a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Constant *Op = CE->getOperand(0); 903ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner const Type *Ty = CE->getType(); 904a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 905ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // We can emit the pointer value into this slot if the slot is an 906ddc94019916fbe4d3fff915e6002c39c63488a44Chris Lattner // integer slot greater or equal to the size of the pointer. 907777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands if (TD->getTypeAllocSize(Ty) >= TD->getTypeAllocSize(Op->getType())) 9084a6bd33da0e30c26568baf3ad6c94d1f497e5ea7Chris Lattner return EmitConstantValueOnly(Op); 909d6227385fc499a8b8bc23766735f1d809d194378Nick Lewycky 910d6227385fc499a8b8bc23766735f1d809d194378Nick Lewycky O << "(("; 91125045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(Op); 912777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands APInt ptrMask = APInt::getAllOnesValue(TD->getTypeAllocSizeInBits(Ty)); 913fad86b003a839cef40ec8ce8408322f4913368caChris Lattner 914fad86b003a839cef40ec8ce8408322f4913368caChris Lattner SmallString<40> S; 915fad86b003a839cef40ec8ce8408322f4913368caChris Lattner ptrMask.toStringUnsigned(S); 916fad86b003a839cef40ec8ce8408322f4913368caChris Lattner O << ") & " << S.c_str() << ')'; 917a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner break; 918a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 919a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner case Instruction::Add: 92013b7d3d499ec63c5f417f7a7246afb77adb63b2eAnton Korobeynikov case Instruction::Sub: 921feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::And: 922feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Or: 923feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Xor: 924d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '('; 92525045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(CE->getOperand(0)); 926d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << ')'; 927feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov switch (Opcode) { 928feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Add: 929feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " + "; 930feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 931feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Sub: 932feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " - "; 933feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 934feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::And: 935feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " & "; 936feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 937feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Or: 938feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " | "; 939feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 940feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov case Instruction::Xor: 941feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov O << " ^ "; 942feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 943feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov default: 944feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov break; 945feb8893d1757cc4f9400a5969df7f926606e246eAnton Korobeynikov } 946d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '('; 94725045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(CE->getOperand(1)); 948d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << ')'; 949a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner break; 950a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner default: 951c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unsupported operator!"); 952a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 953a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } else { 954c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unknown constant value!"); 955a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner } 956a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 9571b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 9582980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner/// printAsCString - Print the specified array as a C compatible string, only if 9591b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner/// the predicate isString is true. 9601b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner/// 96171847813bc419f7a0667468136a07429c6d9f164David Greenestatic void printAsCString(formatted_raw_ostream &O, const ConstantArray *CVA, 9622980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner unsigned LastElt) { 9631b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner assert(CVA->isString() && "Array is not string compatible!"); 9641b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 965d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 9662980cefb809c60aa1d7dd85adfc2c269f731de88Chris Lattner for (unsigned i = 0; i != LastElt; ++i) { 967edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman unsigned char C = 968b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer (unsigned char)cast<ConstantInt>(CVA->getOperand(i))->getZExtValue(); 969f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey printStringChar(O, C); 9701b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 971d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\"'; 9721b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner} 9731b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 974c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen/// EmitString - Emit a zero-byte-terminated string constant. 975c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen/// 976c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohenvoid AsmPrinter::EmitString(const ConstantArray *CVA) const { 977c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen unsigned NumElts = CVA->getNumOperands(); 978563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (TAI->getAscizDirective() && NumElts && 979b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer cast<ConstantInt>(CVA->getOperand(NumElts-1))->getZExtValue() == 0) { 980563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getAscizDirective(); 981c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen printAsCString(O, CVA, NumElts-1); 982c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen } else { 983563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getAsciiDirective(); 984c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen printAsCString(O, CVA, NumElts); 985c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen } 986d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 987c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen} 988c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 989d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantArray(const ConstantArray *CVA, 990d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta unsigned AddrSpace) { 99100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (CVA->isString()) { 99200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitString(CVA); 99300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { // Not a string. Print the values in successive locations 99400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i) 995d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta EmitGlobalConstant(CVA->getOperand(i), AddrSpace); 99600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 99700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 99800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 99900d448a341175556ebd86af68219f5b90b7145a3Dan Gohmanvoid AsmPrinter::EmitGlobalConstantVector(const ConstantVector *CP) { 100000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const VectorType *PTy = CP->getType(); 100100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 100200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned I = 0, E = PTy->getNumElements(); I < E; ++I) 100300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitGlobalConstant(CP->getOperand(I)); 100400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 100500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1006c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantStruct(const ConstantStruct *CVS, 1007c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 100800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Print the fields in successive locations. Pad to align if needed! 100900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 1010777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands unsigned Size = TD->getTypeAllocSize(CVS->getType()); 101100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const StructLayout *cvsLayout = TD->getStructLayout(CVS->getType()); 101200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t sizeSoFar = 0; 101300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = CVS->getNumOperands(); i != e; ++i) { 101400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const Constant* field = CVS->getOperand(i); 101500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 101600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Check if padding is needed and insert one or more 0s. 1017777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands uint64_t fieldSize = TD->getTypeAllocSize(field->getType()); 101800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t padSize = ((i == e-1 ? Size : cvsLayout->getElementOffset(i+1)) 101900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman - cvsLayout->getElementOffset(i)) - fieldSize; 102000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman sizeSoFar += fieldSize + padSize; 102100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 102200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Now print the actual field value. 1023c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstant(field, AddrSpace); 102400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 102500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Insert padding - this may include padding to increase the size of the 102600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // current field up to the ABI size (if the struct is not packed) as well 102700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // as padding to ensure that the next field starts at the right offset. 1028c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitZeros(padSize, AddrSpace); 102900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 103000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman assert(sizeSoFar == cvsLayout->getSizeInBytes() && 103100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman "Layout of constant struct may be incorrect!"); 103200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 103300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1034c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantFP(const ConstantFP *CFP, 1035c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 103600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // FP Constants are printed as integer constants to avoid losing 103700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // precision... 103800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 103900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (CFP->getType() == Type::DoubleTy) { 104000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman double Val = CFP->getValueAPF().convertToDouble(); // for comment only 104100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t i = CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1042f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (TAI->getData64bitsDirective(AddrSpace)) { 1043f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData64bitsDirective(AddrSpace) << i; 1044f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1045f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " double value: " << Val; 1046f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1047f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng } else if (TD->isBigEndian()) { 1048f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1049f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1050f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1051f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double most significant word " << Val; 1052f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1053f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1054f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1055f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1056f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double least significant word " << Val; 1057f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 105800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1059f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i); 1060f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1061f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1062f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double least significant word " << Val; 1063f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1064f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(i >> 32); 1065f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1066f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1067f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " double most significant word " << Val; 1068f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 106900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 107000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 107100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (CFP->getType() == Type::FloatTy) { 107200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman float Val = CFP->getValueAPF().convertToFloat(); // for comment only 1073c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData32bitsDirective(AddrSpace) 1074f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << CFP->getValueAPF().bitcastToAPInt().getZExtValue(); 1075f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1076f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " float " << Val; 1077f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 107800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 107900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (CFP->getType() == Type::X86_FP80Ty) { 108000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // all long double variants are printed as hex 108100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // api needed to prevent premature destruction 108200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman APInt api = CFP->getValueAPF().bitcastToAPInt(); 108300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *p = api.getRawData(); 108400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Convert to double so we can print the approximate val as a comment. 108500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman APFloat DoubleVal = CFP->getValueAPF(); 108600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman bool ignored; 108700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman DoubleVal.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, 108800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman &ignored); 108900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) { 1090f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1091f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1092f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1093f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant halfword of ~" 1094f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << DoubleVal.convertToDouble(); 1095f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1096f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1097f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1098f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " long double next halfword"; 1099f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1100f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1101f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1102f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " long double next halfword"; 1103f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1104f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1105f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1106f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " long double next halfword"; 1107f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1108f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1109f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1110f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1111f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant halfword"; 1112f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 111300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1114f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0]); 1115f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1116f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1117f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant halfword of ~" 1118f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << DoubleVal.convertToDouble(); 1119f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1120f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 16); 1121f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1122f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1123f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next halfword"; 1124f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1125f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 32); 1126f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1127f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1128f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next halfword"; 1129f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1130f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[0] >> 48); 1131f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1132f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1133f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next halfword"; 1134f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1135f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData16bitsDirective(AddrSpace) << uint16_t(p[1]); 1136f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1137f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1138f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant halfword"; 1139f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 114000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 1141777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands EmitZeros(TD->getTypeAllocSize(Type::X86_FP80Ty) - 1142c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta TD->getTypeStoreSize(Type::X86_FP80Ty), AddrSpace); 114300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 114400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (CFP->getType() == Type::PPC_FP128Ty) { 114500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // all long double variants are printed as hex 114600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // api needed to prevent premature destruction 114700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman APInt api = CFP->getValueAPF().bitcastToAPInt(); 114800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *p = api.getRawData(); 114900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) { 1150f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1151f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1152f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1153f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant word"; 1154f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1155f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1156f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1157f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1158f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1159f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1160f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1161f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1162f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1163f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1164f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1165f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1166f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1167f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1168f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant word"; 1169f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 117000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1171f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1]); 1172f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1173f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1174f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double least significant word"; 1175f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1176f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[1] >> 32); 1177f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1178f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1179f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1180f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1181f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0]); 1182f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1183f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1184f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double next word"; 1185f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1186f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << uint32_t(p[0] >> 32); 1187f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1188f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1189f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " long double most significant word"; 1190f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 119100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 119200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 1193c23197a26f34f559ea9797de51e187087c039c42Torok Edwin } else llvm_unreachable("Floating point constant type not handled"); 119400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 119500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1196c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstantLargeInt(const ConstantInt *CI, 1197c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace) { 119800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const TargetData *TD = TM.getTargetData(); 119900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman unsigned BitWidth = CI->getBitWidth(); 120000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman assert(isPowerOf2_32(BitWidth) && 120100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman "Non-power-of-2-sized integers not handled!"); 120200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 120300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // We don't expect assemblers to support integer data directives 120400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // for more than 64 bits, so we emit the data in at most 64-bit 120500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // quantities at a time. 120600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const uint64_t *RawData = CI->getValue().getRawData(); 120700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) { 120800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman uint64_t Val; 120900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (TD->isBigEndian()) 121000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman Val = RawData[e - i - 1]; 121100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman else 121200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman Val = RawData[i]; 121300d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 1214c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta if (TAI->getData64bitsDirective(AddrSpace)) 1215c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData64bitsDirective(AddrSpace) << Val << '\n'; 121600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman else if (TD->isBigEndian()) { 1217f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32); 1218f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1219f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1220f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word most significant word " << Val; 1221f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1222f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val); 1223f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1224f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1225f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word least significant word " << Val; 1226f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 122700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else { 1228f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val); 1229f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1230f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1231f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word least significant word " << Val; 1232f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 1233f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getData32bitsDirective(AddrSpace) << unsigned(Val >> 32); 1234f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1235f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() 1236f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << " Double-word most significant word " << Val; 1237f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\n'; 123800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 123900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } 124000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman} 124100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman 124225045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner/// EmitGlobalConstant - Print a general LLVM constant to the .s file. 1243c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { 1244a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson const TargetData *TD = TM.getTargetData(); 124500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman const Type *type = CV->getType(); 1246777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands unsigned Size = TD->getTypeAllocSize(type); 12471b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 1248bd1d382cc47dfc43ee758714bc22ab5a750bad15Chris Lattner if (CV->isNullValue() || isa<UndefValue>(CV)) { 1249c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitZeros(Size, AddrSpace); 12501b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12511b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } else if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) { 1252d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta EmitGlobalConstantArray(CVA , AddrSpace); 12531b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12541b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } else if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV)) { 1255c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantStruct(CVS, AddrSpace); 12561b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12571b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) { 1258c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantFP(CFP, AddrSpace); 125900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman return; 126000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman } else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 126100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman // Small integers are handled below; large integers are handled here. 126200d448a341175556ebd86af68219f5b90b7145a3Dan Gohman if (Size > 4) { 1263c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta EmitGlobalConstantLargeInt(CI, AddrSpace); 12641b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner return; 12651b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 12669d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer } else if (const ConstantVector *CP = dyn_cast<ConstantVector>(CV)) { 126700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman EmitGlobalConstantVector(CP); 12688cfa57b1b4eade4e0101195b2f94ab288cd03563Nate Begeman return; 12691b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner } 12701b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner 1271c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta printDataDirective(type, AddrSpace); 127225045bdcda822d63674e2df7e34016536c5d3fa7Chris Lattner EmitConstantValueOnly(CV); 1273f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) { 1274f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) { 1275f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng SmallString<40> S; 1276f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng CI->getValue().toStringUnsigned(S, 16); 1277f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << "\t\t\t" << TAI->getCommentString() << " 0x" << S.c_str(); 1278f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng } 1279eefc845b5f407adf1992602aaac1142b2d583220Scott Michel } 1280d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; 12811b7e2356ace23af872cc7d66cf45c56b10e77c4dChris Lattner} 12820264d1a4777370009176157b76d116b3195e3767Chris Lattner 1283fad86b003a839cef40ec8ce8408322f4913368caChris Lattnervoid AsmPrinter::EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) { 1284d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng // Target doesn't support this yet! 1285c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Target does not support EmitMachineConstantPoolValue"); 1286d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 1287d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 12883ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// PrintSpecial - Print information related to the specified machine instr 12893ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// that is independent of the operand, and may be independent of the instr 12903ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// itself. This can be useful for portably encoding the comment character 12913ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// or other bits of target-specific knowledge into the asmstrings. The 12923ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// syntax used is ${:comment}. Targets can override this to add support 12933ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner/// for their own strange codes. 12943e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattnervoid AsmPrinter::PrintSpecial(const MachineInstr *MI, const char *Code) const { 1295bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner if (!strcmp(Code, "private")) { 1296bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner O << TAI->getPrivateGlobalPrefix(); 1297bae02cfd46c569bb571a234544fb1bbe19c43b59Chris Lattner } else if (!strcmp(Code, "comment")) { 1298f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1299f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << TAI->getCommentString(); 13003ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } else if (!strcmp(Code, "uid")) { 1301b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner // Comparing the address of MI isn't sufficient, because machineinstrs may 1302b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner // be allocated to the same address across functions. 1303b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner const Function *ThisF = MI->getParent()->getParent()->getFunction(); 1304b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner 1305bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson // If this is a new LastFn instruction, bump the counter. 1306bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson if (LastMI != MI || LastFn != ThisF) { 1307b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner ++Counter; 1308b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner LastMI = MI; 1309bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson LastFn = ThisF; 1310b6a24bfa9550e5561da3091f7e5132575bf5a19eChris Lattner } 13113ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner O << Counter; 13123ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } else { 13137d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin std::string msg; 13147d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin raw_string_ostream Msg(msg); 13157d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin Msg << "Unknown special formatter '" << Code 1316e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling << "' for machine instr: " << *MI; 13177d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error(Msg.str()); 13183ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner } 13193ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner} 13203ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1321cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis/// processDebugLoc - Processes the debug information of each machine 1322cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis/// instruction's DebugLoc. 1323cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidisvoid AsmPrinter::processDebugLoc(DebugLoc DL) { 1324cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis if (TAI->doesSupportDebugInformation() && DW->ShouldEmitDwarfDebug()) { 1325cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis if (!DL.isUnknown()) { 1326cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis DebugLocTuple CurDLT = MF->getDebugLocTuple(DL); 1327cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis 1328cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis if (CurDLT.CompileUnit != 0 && PrevDLT != CurDLT) 1329cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis printLabel(DW->RecordSourceLine(CurDLT.Line, CurDLT.Col, 1330cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis DICompileUnit(CurDLT.CompileUnit))); 1331cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis 1332cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis PrevDLT = CurDLT; 1333cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis } 1334cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis } 1335cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis} 13363ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 13370264d1a4777370009176157b76d116b3195e3767Chris Lattner/// printInlineAsm - This method formats and prints the specified machine 13380264d1a4777370009176157b76d116b3195e3767Chris Lattner/// instruction that is an inline asm. 13390264d1a4777370009176157b76d116b3195e3767Chris Lattnervoid AsmPrinter::printInlineAsm(const MachineInstr *MI) const { 1340f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner unsigned NumOperands = MI->getNumOperands(); 1341f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner 1342f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner // Count the number of register definitions. 1343f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner unsigned NumDefs = 0; 1344d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman for (; MI->getOperand(NumDefs).isReg() && MI->getOperand(NumDefs).isDef(); 134567942f5dc30be1810f983aba8c94c49ca44e8634Chris Lattner ++NumDefs) 1346f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner assert(NumDefs != NumOperands-1 && "No asm string?"); 1347f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner 1348d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman assert(MI->getOperand(NumDefs).isSymbol() && "No asm string?"); 13496609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 13506609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Disassemble the AsmStr, printing out the literal pieces, the operands, etc. 1351f2b67cff040d1eb3229f7929d0ec7a5e016a7a57Chris Lattner const char *AsmStr = MI->getOperand(NumDefs).getSymbolName(); 13526609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1353ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen // If this asmstr is empty, just print the #APP/#NOAPP markers. 1354ba2a0b960ea4c73d0f81557f63ae2ea126e08905Dale Johannesen // These are useful to see where empty asm's wound up. 1355f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner if (AsmStr[0] == 0) { 1356d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getInlineAsmStart() << "\n\t" << TAI->getInlineAsmEnd() << '\n'; 1357f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner return; 1358f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner } 1359f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner 1360563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getInlineAsmStart() << "\n\t"; 1361f26f5dde14dddb7540d4d8024ecdd7f5a8390b39Chris Lattner 1362eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling // The variant of the current asmprinter. 1363eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling int AsmPrinterVariant = TAI->getAssemblerDialect(); 1364eb9a42c90bf7e21ad8544315a65f86b668cc0277Bill Wendling 13656609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner int CurVariant = -1; // The number of the {.|.|.} region we are in. 13666609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *LastEmitted = AsmStr; // One past the last character emitted. 13672cc2f66c25d9576743026688fdae5ed402726532Chris Lattner 13686609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner while (*LastEmitted) { 13696609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner switch (*LastEmitted) { 13706609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner default: { 13716609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Not a special case, emit the string section literally. 13726609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *LiteralEnd = LastEmitted+1; 13736609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner while (*LiteralEnd && *LiteralEnd != '{' && *LiteralEnd != '|' && 13741c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner *LiteralEnd != '}' && *LiteralEnd != '$' && *LiteralEnd != '\n') 13756609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LiteralEnd; 13766609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 13776609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner O.write(LastEmitted, LiteralEnd-LastEmitted); 13786609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner LastEmitted = LiteralEnd; 13796609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 13806609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 13811c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner case '\n': 13821c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner ++LastEmitted; // Consume newline character. 1383d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << '\n'; // Indent code with newline. 13841c05997bd8d8b3e97c9a5384f8197d0348e237a3Chris Lattner break; 13856609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner case '$': { 13866609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '$' character. 1387faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner bool Done = true; 1388faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner 1389faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner // Handle escapes. 1390faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner switch (*LastEmitted) { 1391faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner default: Done = false; break; 1392faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '$': // $$ -> $ 13936609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) 13946609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner O << '$'; 13956609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume second '$' character. 13966609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 1397faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '(': // $( -> same as GCC's { character. 1398faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // Consume '(' character. 1399faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner if (CurVariant != -1) { 14007d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Nested variants found in inline asm string: '" 14017d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 1402faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner } 1403faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner CurVariant = 0; // We're in the first variant now. 1404faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 1405faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case '|': 1406faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // consume '|' character. 14078b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen if (CurVariant == -1) 14088b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen O << '|'; // this is gcc's behavior for | outside a variant 14098b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen else 14108b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen ++CurVariant; // We're in the next variant. 1411faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 1412faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner case ')': // $) -> same as GCC's } char. 1413faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner ++LastEmitted; // consume ')' character. 14148b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen if (CurVariant == -1) 14158b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen O << '}'; // this is gcc's behavior for } outside a variant 14168b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen else 14178b1e0549389e4c360ac95f50da95d5009553b447Dale Johannesen CurVariant = -1; 1418faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner break; 14196609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1420faf1daeb92bf4db4a6a68d296e24a6e2a4768022Chris Lattner if (Done) break; 14216609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 14226609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner bool HasCurlyBraces = false; 14236609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (*LastEmitted == '{') { // ${variable} 14246609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '{' character. 14256609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner HasCurlyBraces = true; 14266609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14276609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 14283e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // If we have ${:foo}, then this is not a real operand reference, it is a 14293e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // "magic" string reference, just like in .td files. Arrange to call 14303e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner // PrintSpecial. 14313e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner if (HasCurlyBraces && *LastEmitted == ':') { 14323e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner ++LastEmitted; 14333e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner const char *StrStart = LastEmitted; 14343e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner const char *StrEnd = strchr(StrStart, '}'); 14353e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner if (StrEnd == 0) { 14367d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Unterminated ${:foo} operand in inline asm string: '" 14377d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 14383e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner } 14393e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner 14403e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner std::string Val(StrStart, StrEnd); 14413e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner PrintSpecial(MI, Val.c_str()); 14423e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner LastEmitted = StrEnd+1; 14433e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner break; 14443e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner } 14453e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner 14466609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner const char *IDStart = LastEmitted; 14476609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner char *IDEnd; 1448fad2912522a4c97128d8afcc2f40ca0e39287ddbChris Lattner errno = 0; 14496609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner long Val = strtol(IDStart, &IDEnd, 10); // We only accept numbers for IDs. 14506609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (!isdigit(*IDStart) || (Val == 0 && errno == EINVAL)) { 14517d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad $ operand number in inline asm string: '" 14527d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 14536609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14546609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner LastEmitted = IDEnd; 14556609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1456a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner char Modifier[2] = { 0, 0 }; 1457a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 14586609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (HasCurlyBraces) { 1459a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner // If we have curly braces, check for a modifier character. This 1460a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner // supports syntax like ${0:u}, which correspond to "%u0" in GCC asm. 1461a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner if (*LastEmitted == ':') { 1462a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner ++LastEmitted; // Consume ':' character. 1463a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner if (*LastEmitted == 0) { 14647d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad ${:} expression in inline asm string: '" 14657d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 1466a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner } 1467a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 1468a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner Modifier[0] = *LastEmitted; 1469a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner ++LastEmitted; // Consume modifier character. 1470a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner } 1471a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner 14726609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if (*LastEmitted != '}') { 14737d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Bad ${} expression in inline asm string: '" 14747d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 14756609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14766609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner ++LastEmitted; // Consume '}' character. 14776609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14786609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 14796609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner if ((unsigned)Val >= NumOperands-1) { 14807d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error("Invalid $ operand number in inline asm string: '" 14817d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin + std::string(AsmStr) + "'"); 14826609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 14836609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1484c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner // Okay, we finally have a value number. Ask the target to print this 14856609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // operand! 1486c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner if (CurVariant == -1 || CurVariant == AsmPrinterVariant) { 1487c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner unsigned OpNo = 1; 1488fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1489fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner bool Error = false; 1490fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1491c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner // Scan to find the machine operand number for the operand. 1492daf6bc6347b4785102611bdf21c512e8a7678cceChris Lattner for (; Val; --Val) { 1493fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner if (OpNo >= MI->getNumOperands()) break; 14949e3304900ff69c4920fea7369c9c36916c4a6a6aChris Lattner unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1495697cbbfb00c318f98d6eb51945f077e2bfe8781eEvan Cheng OpNo += InlineAsm::getNumOperandRegisters(OpFlags) + 1; 1496daf6bc6347b4785102611bdf21c512e8a7678cceChris Lattner } 1497fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1498fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner if (OpNo >= MI->getNumOperands()) { 1499fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner Error = true; 1500dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner } else { 15019e3304900ff69c4920fea7369c9c36916c4a6a6aChris Lattner unsigned OpFlags = MI->getOperand(OpNo).getImm(); 1502fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner ++OpNo; // Skip over the ID number. 1503fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner 1504eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen if (Modifier[0]=='l') // labels are target independent 15058aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner printBasicBlockLabel(MI->getOperand(OpNo).getMBB(), 1506fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng false, false, false); 1507eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen else { 1508eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen AsmPrinter *AP = const_cast<AsmPrinter*>(this); 150986b49f8e2de796cb46c7c8b6a4c4900533fd53f4Dale Johannesen if ((OpFlags & 7) == 4) { 1510eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Error = AP->PrintAsmMemoryOperand(MI, OpNo, AsmPrinterVariant, 1511eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Modifier[0] ? Modifier : 0); 1512eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen } else { 1513eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Error = AP->PrintAsmOperand(MI, OpNo, AsmPrinterVariant, 1514eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen Modifier[0] ? Modifier : 0); 1515eb57ea7ea2378b77bc995371c1888193b960cd03Dale Johannesen } 1516fd561cded3cbaec1a4bdfae0703b4be4ea4092f3Chris Lattner } 1517dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner } 1518dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner if (Error) { 15197d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin std::string msg; 15207d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin raw_string_ostream Msg(msg); 15217d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin Msg << "Invalid operand found in inline asm: '" 1522e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling << AsmStr << "'\n"; 15237d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin MI->print(Msg); 15247d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin llvm_report_error(Msg.str()); 15256609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1526c3a9f8d31ce93ba384bd2bbdd55c757b06600a15Chris Lattner } 15276609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner break; 15286609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15296609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 15306609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner } 1531d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << "\n\t" << TAI->getInlineAsmEnd() << '\n'; 15326609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner} 15336609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner 1534da47e6e0d003c873da960361549e57ee4617c301Evan Cheng/// printImplicitDef - This method prints the specified machine instruction 1535da47e6e0d003c873da960361549e57ee4617c301Evan Cheng/// that is an implicit def. 1536da47e6e0d003c873da960361549e57ee4617c301Evan Chengvoid AsmPrinter::printImplicitDef(const MachineInstr *MI) const { 1537f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng if (VerboseAsm) 1538f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng O << '\t' << TAI->getCommentString() << " implicit-def: " 1539f1c0ae9de5365a578fbdfebe4625fb281b0be592Evan Cheng << TRI->getAsmName(MI->getOperand(0).getReg()) << '\n'; 1540da47e6e0d003c873da960361549e57ee4617c301Evan Cheng} 1541da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 15421ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey/// printLabel - This method prints a local label used by debug and 15431ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey/// exception handling tables. 15441ee29257428960fede862fcfdbe80d5d007927e9Jim Laskeyvoid AsmPrinter::printLabel(const MachineInstr *MI) const { 1545528bc028774513ee76125f85ceb8f704f5901cc8Dan Gohman printLabel(MI->getOperand(0).getImm()); 15461ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey} 15471ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey 15481b08bbca5592351a940bcd164bdec724ee954326Evan Chengvoid AsmPrinter::printLabel(unsigned Id) const { 15494eecdeb3faf5df864790175da5d58301b751ec11Evan Cheng O << TAI->getPrivateGlobalPrefix() << "label" << Id << ":\n"; 15501b08bbca5592351a940bcd164bdec724ee954326Evan Cheng} 15511b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 1552a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng/// printDeclare - This method prints a local variable declaration used by 1553a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng/// debug tables. 15544e3f5a4e9c13f216856515e6f000881f2c850736Evan Cheng/// FIXME: It doesn't really print anything rather it inserts a DebugVariable 15554e3f5a4e9c13f216856515e6f000881f2c850736Evan Cheng/// entry into dwarf table. 1556a844bdeab31ef04221e7ef59a8467893584cc14dEvan Chengvoid AsmPrinter::printDeclare(const MachineInstr *MI) const { 1557c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel unsigned FI = MI->getOperand(0).getIndex(); 15584e3f5a4e9c13f216856515e6f000881f2c850736Evan Cheng GlobalValue *GV = MI->getOperand(1).getGlobal(); 15591be3eccecbd2fa50ed9008ffee01f6351df5d8f7Devang Patel DW->RecordVariable(cast<GlobalVariable>(GV), FI, MI); 1560a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng} 1561a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 15626609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 15636609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// instruction, using the specified assembler variant. Targets should 15646609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner/// overried this to format as appropriate. 15656609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattnerbool AsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 1566a36cb0a6b110f1ac9a9388019febb64620a124b9Chris Lattner unsigned AsmVariant, const char *ExtraCode) { 15676609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner // Target doesn't support this yet! 15686609913b7d0ad13058d4ffffb17fb8d8078799efChris Lattner return true; 15690264d1a4777370009176157b76d116b3195e3767Chris Lattner} 1570dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner 1571dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattnerbool AsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 1572dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner unsigned AsmVariant, 1573dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner const char *ExtraCode) { 1574dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner // Target doesn't support this yet! 1575dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner return true; 1576dd26033002b1b4c569df84ac947828c0fc02f6baChris Lattner} 157737efe6764568a3829fee26aba532283131d1a104Nate Begeman 157837efe6764568a3829fee26aba532283131d1a104Nate Begeman/// printBasicBlockLabel - This method prints the label for the specified 157937efe6764568a3829fee26aba532283131d1a104Nate Begeman/// MachineBasicBlock 1580cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begemanvoid AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB, 1581fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool printAlign, 1582cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printColon, 1583cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printComment) const { 1584fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng if (printAlign) { 1585fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng unsigned Align = MBB->getAlignment(); 1586fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng if (Align) 1587fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng EmitAlignment(Log2_32(Align)); 1588fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng } 1589fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 1590d19a53ba1d4629f69821f37ca824c65e6df8e8f9Dan Gohman O << TAI->getPrivateGlobalPrefix() << "BB" << getFunctionNumber() << '_' 1591347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << MBB->getNumber(); 1592cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman if (printColon) 1593cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman O << ':'; 15949c78ecb511ba6c8f53579ce60bcc4ef782eb831cChris Lattner if (printComment && MBB->getBasicBlock()) 1595286d56935c671a7d3fbf109828768618b97c5673Dan Gohman O << '\t' << TAI->getCommentString() << ' ' 159677c8f7674db1a3c57fa9d8916957a01f9961ef9cEvan Cheng << MBB->getBasicBlock()->getNameStart(); 159737efe6764568a3829fee26aba532283131d1a104Nate Begeman} 159852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 1599cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng/// printPICJumpTableSetLabel - This method prints a set label for the 1600cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng/// specified MachineBasicBlock for a jumptable entry. 1601cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Chengvoid AsmPrinter::printPICJumpTableSetLabel(unsigned uid, 1602cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const { 1603563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey if (!TAI->getSetDirective()) 160452a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman return; 160552a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 1606563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() 1607347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << getFunctionNumber() << '_' << uid << "_set_" << MBB->getNumber() << ','; 1608fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 1609347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1610347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << uid << '\n'; 161152a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman} 1612d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 1613cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Chengvoid AsmPrinter::printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 1614cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const { 161541349c10cbb166c58a20896e4761455f001c611eEvan Cheng if (!TAI->getSetDirective()) 161641349c10cbb166c58a20896e4761455f001c611eEvan Cheng return; 161741349c10cbb166c58a20896e4761455f001c611eEvan Cheng 161841349c10cbb166c58a20896e4761455f001c611eEvan Cheng O << TAI->getSetDirective() << ' ' << TAI->getPrivateGlobalPrefix() 1619347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << getFunctionNumber() << '_' << uid << '_' << uid2 1620347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << "_set_" << MBB->getNumber() << ','; 1621fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng printBasicBlockLabel(MBB, false, false, false); 1622347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng O << '-' << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() 1623347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng << '_' << uid << '_' << uid2 << '\n'; 162441349c10cbb166c58a20896e4761455f001c611eEvan Cheng} 162541349c10cbb166c58a20896e4761455f001c611eEvan Cheng 1626d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng/// printDataDirective - This method prints the asm directive for the 1627d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng/// specified type. 1628c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Guptavoid AsmPrinter::printDataDirective(const Type *type, unsigned AddrSpace) { 1629d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng const TargetData *TD = TM.getTargetData(); 1630d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng switch (type->getTypeID()) { 1631f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner case Type::FloatTyID: case Type::DoubleTyID: 1632f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner case Type::X86_FP80TyID: case Type::FP128TyID: case Type::PPC_FP128TyID: 1633f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner assert(0 && "Should have already output floating point constant."); 1634f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner default: 1635f1cfea2dbfd6ebc0008ecd2d37a1c91058bbfdd1Chris Lattner assert(0 && "Can't handle printing this type of thing"); 1636a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer case Type::IntegerTyID: { 1637a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer unsigned BitWidth = cast<IntegerType>(type)->getBitWidth(); 1638a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer if (BitWidth <= 8) 1639c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData8bitsDirective(AddrSpace); 1640a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 16) 1641c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData16bitsDirective(AddrSpace); 1642a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 32) 1643c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData32bitsDirective(AddrSpace); 1644a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer else if (BitWidth <= 64) { 1645c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta assert(TAI->getData64bitsDirective(AddrSpace) && 1646a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer "Target cannot handle 64-bit constant exprs!"); 1647c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData64bitsDirective(AddrSpace); 164882f94f1ad98fdcc90e44053437fa555d339a4449Dan Gohman } else { 1649c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Target cannot handle given data directive width!"); 1650a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } 1651d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng break; 1652a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } 1653d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng case Type::PointerTyID: 1654d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng if (TD->getPointerSize() == 8) { 1655c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta assert(TAI->getData64bitsDirective(AddrSpace) && 1656d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng "Target cannot handle 64-bit pointer exprs!"); 1657c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData64bitsDirective(AddrSpace); 1658fcc6f1556efb386af47293d9f8599bab2b34321cSanjiv Gupta } else if (TD->getPointerSize() == 2) { 1659c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData16bitsDirective(AddrSpace); 1660fcc6f1556efb386af47293d9f8599bab2b34321cSanjiv Gupta } else if (TD->getPointerSize() == 1) { 1661c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData8bitsDirective(AddrSpace); 1662a54b7cbd452b3adb2f51346140d996b29c2cdb30Reid Spencer } else { 1663c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta O << TAI->getData32bitsDirective(AddrSpace); 1664d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 1665d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng break; 1666d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng } 1667d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng} 16684c3a5f8ccba6680b948a1a234f123b4505e43529Dale Johannesen 1669f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikovvoid AsmPrinter::printVisibility(const std::string& Name, 1670f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov unsigned Visibility) const { 1671f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov if (Visibility == GlobalValue::HiddenVisibility) { 1672f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov if (const char *Directive = TAI->getHiddenDirective()) 1673f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov O << Directive << Name << '\n'; 1674f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov } else if (Visibility == GlobalValue::ProtectedVisibility) { 1675f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov if (const char *Directive = TAI->getProtectedDirective()) 1676f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov O << Directive << Name << '\n'; 1677f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov } 1678f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov} 1679c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 16807751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikovvoid AsmPrinter::printOffset(int64_t Offset) const { 16817751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov if (Offset > 0) 16827751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov O << '+' << Offset; 16837751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov else if (Offset < 0) 16847751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov O << Offset; 16857751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov} 16867751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov 16875eca075b74d62c621b160aa216b4cd50829a2cc7Gordon HenriksenGCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) { 16885eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen if (!S->usesMetadata()) 1689c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen return 0; 1690c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 16915eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen gcp_iterator GCPI = GCMetadataPrinters.find(S); 1692c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen if (GCPI != GCMetadataPrinters.end()) 1693c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen return GCPI->second; 1694c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 16955eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *Name = S->getName().c_str(); 1696c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 1697c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen for (GCMetadataPrinterRegistry::iterator 1698c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen I = GCMetadataPrinterRegistry::begin(), 1699c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen E = GCMetadataPrinterRegistry::end(); I != E; ++I) 1700c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen if (strcmp(Name, I->getName()) == 0) { 17015eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GMP = I->instantiate(); 17025eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GMP->S = S; 17035eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinters.insert(std::make_pair(S, GMP)); 17045eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen return GMP; 1705c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen } 1706c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 17075eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen cerr << "no GCMetadataPrinter registered for GC: " << Name << "\n"; 1708c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable(0); 1709c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen} 1710014700c1a8cba203fd21ff129426ba8a426ab244David Greene 1711014700c1a8cba203fd21ff129426ba8a426ab244David Greene/// EmitComments - Pretty-print comments for instructions 1712014700c1a8cba203fd21ff129426ba8a426ab244David Greenevoid AsmPrinter::EmitComments(const MachineInstr &MI) const 1713014700c1a8cba203fd21ff129426ba8a426ab244David Greene{ 171467e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (VerboseAsm) { 171567e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (!MI.getDebugLoc().isUnknown()) { 171667e59834fc1dca7e357c40af2e5144f3d62f5133David Greene DebugLocTuple DLT = MF->getDebugLocTuple(MI.getDebugLoc()); 171767e59834fc1dca7e357c40af2e5144f3d62f5133David Greene 171867e59834fc1dca7e357c40af2e5144f3d62f5133David Greene // Print source line info 171967e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O.PadToColumn(TAI->getCommentColumn(), 1); 172067e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << TAI->getCommentString() << " SrcLine "; 172167e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (DLT.CompileUnit->hasInitializer()) { 172267e59834fc1dca7e357c40af2e5144f3d62f5133David Greene Constant *Name = DLT.CompileUnit->getInitializer(); 172367e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name)) 172467e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (NameString->isString()) { 172567e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << NameString->getAsString() << " "; 172667e59834fc1dca7e357c40af2e5144f3d62f5133David Greene } 172767e59834fc1dca7e357c40af2e5144f3d62f5133David Greene } 172867e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << DLT.Line; 172967e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (DLT.Col != 0) 173067e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << ":" << DLT.Col; 173167e59834fc1dca7e357c40af2e5144f3d62f5133David Greene } 17323ac1ab835caacdeebbd0d7b4d69160f283928d21David Greene } 1733014700c1a8cba203fd21ff129426ba8a426ab244David Greene} 1734014700c1a8cba203fd21ff129426ba8a426ab244David Greene 1735014700c1a8cba203fd21ff129426ba8a426ab244David Greene/// EmitComments - Pretty-print comments for instructions 1736014700c1a8cba203fd21ff129426ba8a426ab244David Greenevoid AsmPrinter::EmitComments(const MCInst &MI) const 1737014700c1a8cba203fd21ff129426ba8a426ab244David Greene{ 173867e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (VerboseAsm) { 173967e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (!MI.getDebugLoc().isUnknown()) { 174067e59834fc1dca7e357c40af2e5144f3d62f5133David Greene DebugLocTuple DLT = MF->getDebugLocTuple(MI.getDebugLoc()); 174167e59834fc1dca7e357c40af2e5144f3d62f5133David Greene 174267e59834fc1dca7e357c40af2e5144f3d62f5133David Greene // Print source line info 174367e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O.PadToColumn(TAI->getCommentColumn(), 1); 174467e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << TAI->getCommentString() << " SrcLine "; 174567e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (DLT.CompileUnit->hasInitializer()) { 174667e59834fc1dca7e357c40af2e5144f3d62f5133David Greene Constant *Name = DLT.CompileUnit->getInitializer(); 174767e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (ConstantArray *NameString = dyn_cast<ConstantArray>(Name)) 174867e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (NameString->isString()) { 174967e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << NameString->getAsString() << " "; 175067e59834fc1dca7e357c40af2e5144f3d62f5133David Greene } 175167e59834fc1dca7e357c40af2e5144f3d62f5133David Greene } 175267e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << DLT.Line; 175367e59834fc1dca7e357c40af2e5144f3d62f5133David Greene if (DLT.Col != 0) 175467e59834fc1dca7e357c40af2e5144f3d62f5133David Greene O << ":" << DLT.Col; 175567e59834fc1dca7e357c40af2e5144f3d62f5133David Greene } 17563ac1ab835caacdeebbd0d7b4d69160f283928d21David Greene } 1757014700c1a8cba203fd21ff129426ba8a426ab244David Greene} 1758