MCAsmInfo.cpp revision debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2be
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() { 26f9f93e4388962b678fd59b7af5212d4cc0d38be2Chris Lattner HasSubsectionsViaSymbols = false; 27aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner HasMachoZeroFillDirective = false; 28c1a887d76d95100e7e05aa76e077710bc4e0b1cfEric Christopher HasMachoTBSSDirective = false; 2971eae713153e564ec743c5c4162ff258c255de78Chris Lattner HasStaticCtorDtorReferenceInStaticMode = false; 30767b1be3900bdc693aa0ad3e554ba034845f67f7Rafael Espindola LinkerRequiresNonEmptyDwarfLines = false; 3132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov MaxInstLength = 4; 3232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov PCSymbol = "$"; 33d31d304f83f9c8df6870057509414b8d004bc8daJim Grosbach SeparatorString = ";"; 3473163f875ad7e5d56aa7d0d29509eb1e04542742Daniel Dunbar CommentColumn = 40; 3532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov CommentString = "#"; 36e07b75e069969558c3fbb2f5bfb9a652f6ea1d6bChris Lattner LabelSuffix = ":"; 3732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov GlobalPrefix = ""; 3832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov PrivateGlobalPrefix = "."; 3990f8b7073dd472afb21bc33be0f24391e7a4505bChris Lattner LinkerPrivateGlobalPrefix = ""; 40e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner InlineAsmStart = "APP"; 41e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner InlineAsmEnd = "NO_APP"; 4232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AssemblerDialect = 0; 43a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner AllowQuotesInName = false; 44c6f729ed5519cdf398ca4039dbdbea4f81433ec0Anton Korobeynikov AllowNameToStartWithDigit = false; 45b9a01bcf486814a44098745920d43daaf9f7c260Mon P Wang AllowPeriodsInName = true; 4632b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov ZeroDirective = "\t.zero\t"; 4732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AsciiDirective = "\t.ascii\t"; 4832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AscizDirective = "\t.asciz\t"; 4932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data8bitsDirective = "\t.byte\t"; 5032b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data16bitsDirective = "\t.short\t"; 5132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data32bitsDirective = "\t.long\t"; 5232b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov Data64bitsDirective = "\t.quad\t"; 535277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner SunStyleELFSectionSwitchSyntax = false; 54fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes UsesELFSectionDirectiveForBSS = false; 5532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AlignDirective = "\t.align\t"; 5632b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AlignmentIsInBytes = true; 5732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov TextAlignFillValue = 0; 5878f485afb723121eedf4b6907ae6eb53da8af03cChris Lattner GPRel32Directive = 0; 5932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov GlobalDirective = "\t.globl\t"; 60cee63322eaccc2f1067bdf5eab506e440f867da1Chris Lattner HasSetDirective = true; 6190a5a0cd7c353651c953020b1e41b4c6e2f21883Rafael Espindola HasAggressiveSymbolFolding = true; 629eb158d5b4cd4f6fc80912e2dd77bdf13c3ca0e7Chris Lattner HasLCOMMDirective = false; 632e2563bf8e0f0a7f8c923000c0206855f16968b2Rafael Espindola COMMDirectiveAlignmentIsInBytes = true; 6432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov HasDotTypeDotSizeDirective = true; 65952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola HasSingleParameterDotFile = true; 663a9be0ee36fe2143f514d28315f3dc1bda132b2eChris Lattner HasNoDeadStrip = false; 67e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby HasSymbolResolver = false; 6832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov WeakRefDirective = 0; 6932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov WeakDefDirective = 0; 7041eb8b47717e1fe1a6d0e99ec1b4e890091f77aaChris Lattner LinkOnceDirective = 0; 71152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner HiddenVisibilityAttr = MCSA_Hidden; 725129bdecd87c518713765acd6998c80f9eef36a2Stuart Hastings HiddenDeclarationVisibilityAttr = MCSA_Hidden; 73152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner ProtectedVisibilityAttr = MCSA_Protected; 7432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov HasLEB128 = false; 7532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov SupportsDebugInformation = false; 761b747ad8a0694b86e8d98a8b9a05ddfe74ec0cd3Jim Grosbach ExceptionsType = ExceptionHandling::None; 7732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov DwarfRequiresFrameSection = true; 780f7fef3872a37d09c806f52f1d03d74ebc73c171Devang Patel DwarfUsesInlineInfoSection = false; 79ae84d5b9bafd1ba88aa12e8398e5385f229fa306Devang Patel DwarfUsesAbsoluteLabelForStmtList = true; 8032b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov DwarfSectionOffsetDirective = 0; 81b1fcfbe89bd155fb88485b2a3a995adba3994003Devang Patel DwarfUsesLabelOffsetForRanges = true; 828a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner HasMicrosoftFastStdCallMangling = false; 8318a4c16726db2b8874c7b84d04650dda80746074Chris Lattner 8432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov AsmTransCBE = 0; 854c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner} 86f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner 87af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris LattnerMCAsmInfo::~MCAsmInfo() { 88f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner} 894c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner 90a6199c87c293d937b1e57549864345e64e6c6e8bAnton Korobeynikov 91af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerunsigned MCAsmInfo::getULEB128Size(unsigned Value) { 92ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov unsigned Size = 0; 93ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov do { 94ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Value >>= 7; 95ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Size += sizeof(int8_t); 96ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov } while (Value); 97ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov return Size; 98ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov} 99ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov 100af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerunsigned MCAsmInfo::getSLEB128Size(int Value) { 101ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov unsigned Size = 0; 102ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov int Sign = Value >> (8 * sizeof(Value) - 1); 103ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov bool IsMore; 104ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov 105ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov do { 106ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov unsigned Byte = Value & 0x7f; 107ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Value >>= 7; 108ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; 109ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov Size += sizeof(int8_t); 110ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov } while (IsMore); 111ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov return Size; 112ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov} 113bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola 114bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindolaconst MCExpr * 115bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael EspindolaMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, 116debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola unsigned Encoding, 117bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola MCStreamer &Streamer) const { 118debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola return getExprForFDESymbol(Sym, Encoding, Streamer); 119a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola} 120a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola 121a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindolaconst MCExpr * 122a0057ca13f06b8de08483c3e3a143a7236c67097Rafael EspindolaMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, 123debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola unsigned Encoding, 124a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola MCStreamer &Streamer) const { 125debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola if (!(Encoding & dwarf::DW_EH_PE_pcrel)) 126debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola return MCSymbolRefExpr::Create(Sym, Streamer.getContext()); 127debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola 128debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola MCContext &Context = Streamer.getContext(); 129debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context); 130debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola MCSymbol *PCSym = Context.CreateTempSymbol(); 131debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola Streamer.EmitLabel(PCSym); 132debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context); 133debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola return MCBinaryExpr::CreateSub(Res, PC, Context); 134bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola} 135