1af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner//===-- MCAsmInfo.cpp - Asm Info -------------------------------------------==// 2ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// 3ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// The LLVM Compiler Infrastructure 4ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// 8ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//===----------------------------------------------------------------------===// 9ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// 10ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// This file defines target asm properties related what form asm statements 11ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// should take. 12ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey// 13ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey//===----------------------------------------------------------------------===// 14ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey 15af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "llvm/MC/MCAsmInfo.h" 16debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola#include "llvm/MC/MCContext.h" 17bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola#include "llvm/MC/MCExpr.h" 18bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola#include "llvm/MC/MCStreamer.h" 191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 20debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola#include "llvm/Support/Dwarf.h" 213bb6283eead6813e87e018879e7cedde3955ea83Dale Johannesen#include <cctype> 223bb6283eead6813e87e018879e7cedde3955ea83Dale Johannesen#include <cstring> 23ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskeyusing namespace llvm; 24ec0d9fe2b2dc87efb2dcb1a30f267c1e36adf5a5Jim Laskey 258eeba35babf3114966fc4e6e8522057e46b610dbChris LattnerMCAsmInfo::MCAsmInfo() { 261be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng PointerSize = 4; 27e752feee5228bfa33acee35ef9c606ce12f0f173Eli Bendersky CalleeSaveStackSlotSize = 4; 289dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky 291be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng IsLittleEndian = true; 301be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng StackGrowsUp = false; 31f9f93e4388962b678fd59b7af5212d4cc0d38be2Chris Lattner HasSubsectionsViaSymbols = false; 32aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner HasMachoZeroFillDirective = false; 33c1a887d76d95100e7e05aa76e077710bc4e0b1cfEric Christopher HasMachoTBSSDirective = false; 3471eae713153e564ec743c5c4162ff258c255de78Chris Lattner HasStaticCtorDtorReferenceInStaticMode = false; 35767b1be3900bdc693aa0ad3e554ba034845f67f7Rafael Espindola LinkerRequiresNonEmptyDwarfLines = false; 3632b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov MaxInstLength = 4; 37c1f4a4b2640dfc871bacacef53a95f1c96a9fe48Ulrich Weigand MinInstAlignment = 1; 3832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov PCSymbol = "$"; 39d31d304f83f9c8df6870057509414b8d004bc8daJim Grosbach SeparatorString = ";"; 4073163f875ad7e5d56aa7d0d29509eb1e04542742Daniel Dunbar CommentColumn = 40; 4132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov CommentString = "#"; 42e07b75e069969558c3fbb2f5bfb9a652f6ea1d6bChris Lattner LabelSuffix = ":"; 432c3a4641a7785da78839caf574277df9cd93b52cReed Kotler DebugLabelSuffix = ":"; 4432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov GlobalPrefix = ""; 4532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov PrivateGlobalPrefix = "."; 4690f8b7073dd472afb21bc33be0f24391e7a4505bChris Lattner LinkerPrivateGlobalPrefix = ""; 47e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner InlineAsmStart = "APP"; 48e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner InlineAsmEnd = "NO_APP"; 49bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng Code16Directive = ".code16"; 50bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng Code32Directive = ".code32"; 51bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng Code64Directive = ".code64"; 5232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AssemblerDialect = 0; 53a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner AllowQuotesInName = false; 54c6f729ed5519cdf398ca4039dbdbea4f81433ec0Anton Korobeynikov AllowNameToStartWithDigit = false; 55b9a01bcf486814a44098745920d43daaf9f7c260Mon P Wang AllowPeriodsInName = true; 563420e7f360dab7712a9ec4f51d233c7e73642ec7Sean Hunt AllowUTF8 = true; 573e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach UseDataRegionDirectives = false; 5832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov ZeroDirective = "\t.zero\t"; 5932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AsciiDirective = "\t.ascii\t"; 6032b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AscizDirective = "\t.asciz\t"; 6132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data8bitsDirective = "\t.byte\t"; 6232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data16bitsDirective = "\t.short\t"; 6332b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data32bitsDirective = "\t.long\t"; 6432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data64bitsDirective = "\t.quad\t"; 655277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner SunStyleELFSectionSwitchSyntax = false; 66fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes UsesELFSectionDirectiveForBSS = false; 6732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AlignDirective = "\t.align\t"; 6832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AlignmentIsInBytes = true; 6932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov TextAlignFillValue = 0; 706c2cf8b1fbcf70fd9db6fe44032c1ceaa2299760Akira Hatanaka GPRel64Directive = 0; 7178f485afb723121eedf4b6907ae6eb53da8af03cChris Lattner GPRel32Directive = 0; 7232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov GlobalDirective = "\t.globl\t"; 73cee63322eaccc2f1067bdf5eab506e440f867da1Chris Lattner HasSetDirective = true; 7490a5a0cd7c353651c953020b1e41b4c6e2f21883Rafael Espindola HasAggressiveSymbolFolding = true; 752e2563bf8e0f0a7f8c923000c0206855f16968b2Rafael Espindola COMMDirectiveAlignmentIsInBytes = true; 76a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer LCOMMDirectiveAlignmentType = LCOMM::NoAlignment; 7732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov HasDotTypeDotSizeDirective = true; 78952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola HasSingleParameterDotFile = true; 793a9be0ee36fe2143f514d28315f3dc1bda132b2eChris Lattner HasNoDeadStrip = false; 80e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby HasSymbolResolver = false; 8132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov WeakRefDirective = 0; 8232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov WeakDefDirective = 0; 8341eb8b47717e1fe1a6d0e99ec1b4e890091f77aaChris Lattner LinkOnceDirective = 0; 84152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner HiddenVisibilityAttr = MCSA_Hidden; 855129bdecd87c518713765acd6998c80f9eef36a2Stuart Hastings HiddenDeclarationVisibilityAttr = MCSA_Hidden; 86152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner ProtectedVisibilityAttr = MCSA_Protected; 8732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov HasLEB128 = false; 8832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov SupportsDebugInformation = false; 891b747ad8a0694b86e8d98a8b9a05ddfe74ec0cd3Jim Grosbach ExceptionsType = ExceptionHandling::None; 900f7fef3872a37d09c806f52f1d03d74ebc73c171Devang Patel DwarfUsesInlineInfoSection = false; 91ffccd923101ae177c1a2c407618d8f03a312d69bNick Lewycky DwarfUsesRelocationsAcrossSections = true; 923014b2f3228e1aac1a70598f50d66f1afcc16714Akira Hatanaka DwarfRegNumForCFI = false; 938a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner HasMicrosoftFastStdCallMangling = false; 949a0e12a6ed7db1bf49e4676932427e91ae4eb9beMatt Arsenault NeedsDwarfSectionOffsetDirective = false; 954c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner} 96f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner 97af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris LattnerMCAsmInfo::~MCAsmInfo() { 98f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner} 994c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner 100a6199c87c293d937b1e57549864345e64e6c6e8bAnton Korobeynikov 101fe2e66a6dab6162fb10ed2d576cd122f34d2626fDavid Blaikieunsigned MCAsmInfo::getULEB128Size(uint64_t Value) { 102ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov unsigned Size = 0; 103ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov do { 104ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Value >>= 7; 105ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Size += sizeof(int8_t); 106ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov } while (Value); 107ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov return Size; 108ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov} 109ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov 110fe2e66a6dab6162fb10ed2d576cd122f34d2626fDavid Blaikieunsigned MCAsmInfo::getSLEB128Size(int64_t Value) { 111ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov unsigned Size = 0; 112ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov int Sign = Value >> (8 * sizeof(Value) - 1); 113ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov bool IsMore; 114ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov 115ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov do { 116ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov unsigned Byte = Value & 0x7f; 117ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Value >>= 7; 118ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 119ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Size += sizeof(int8_t); 120ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov } while (IsMore); 121ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov return Size; 122ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov} 123bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola 124bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindolaconst MCExpr * 125bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael EspindolaMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, 126debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola unsigned Encoding, 127bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola MCStreamer &Streamer) const { 128debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola return getExprForFDESymbol(Sym, Encoding, Streamer); 129a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola} 130a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola 131a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindolaconst MCExpr * 132a0057ca13f06b8de08483c3e3a143a7236c67097Rafael EspindolaMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, 133debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola unsigned Encoding, 134a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola MCStreamer &Streamer) const { 135debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola if (!(Encoding & dwarf::DW_EH_PE_pcrel)) 136debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola return MCSymbolRefExpr::Create(Sym, Streamer.getContext()); 137debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola 138debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola MCContext &Context = Streamer.getContext(); 139debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context); 140debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola MCSymbol *PCSym = Context.CreateTempSymbol(); 141debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola Streamer.EmitLabel(PCSym); 142debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context); 143debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola return MCBinaryExpr::CreateSub(Res, PC, Context); 144bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola} 145