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