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;
271be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng  IsLittleEndian = true;
281be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng  StackGrowsUp = false;
29f9f93e4388962b678fd59b7af5212d4cc0d38be2Chris Lattner  HasSubsectionsViaSymbols = false;
30aac138e84dee1cb3ffc1035b2a1e4361fe0b4f80Chris Lattner  HasMachoZeroFillDirective = false;
31c1a887d76d95100e7e05aa76e077710bc4e0b1cfEric Christopher  HasMachoTBSSDirective = false;
3271eae713153e564ec743c5c4162ff258c255de78Chris Lattner  HasStaticCtorDtorReferenceInStaticMode = false;
33767b1be3900bdc693aa0ad3e554ba034845f67f7Rafael Espindola  LinkerRequiresNonEmptyDwarfLines = false;
3432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  MaxInstLength = 4;
3532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  PCSymbol = "$";
36d31d304f83f9c8df6870057509414b8d004bc8daJim Grosbach  SeparatorString = ";";
3773163f875ad7e5d56aa7d0d29509eb1e04542742Daniel Dunbar  CommentColumn = 40;
3832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  CommentString = "#";
39e07b75e069969558c3fbb2f5bfb9a652f6ea1d6bChris Lattner  LabelSuffix = ":";
4032b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  GlobalPrefix = "";
4132b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  PrivateGlobalPrefix = ".";
4290f8b7073dd472afb21bc33be0f24391e7a4505bChris Lattner  LinkerPrivateGlobalPrefix = "";
43e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner  InlineAsmStart = "APP";
44e2b060161c92ddf60b5d020f981451e9e34a3f02Chris Lattner  InlineAsmEnd = "NO_APP";
45bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  Code16Directive = ".code16";
46bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  Code32Directive = ".code32";
47bd27f5adbd8f3b8ab8def5aa43fbc406ac9b8cbeEvan Cheng  Code64Directive = ".code64";
4832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AssemblerDialect = 0;
49a93ca92379129e87e0130609ac78422fcf6dd21eChris Lattner  AllowQuotesInName = false;
50c6f729ed5519cdf398ca4039dbdbea4f81433ec0Anton Korobeynikov  AllowNameToStartWithDigit = false;
51b9a01bcf486814a44098745920d43daaf9f7c260Mon P Wang  AllowPeriodsInName = true;
523420e7f360dab7712a9ec4f51d233c7e73642ec7Sean Hunt  AllowUTF8 = true;
533e96531186ba574b0c25a4be62d24b8b7d752c9fJim Grosbach  UseDataRegionDirectives = false;
5432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  ZeroDirective = "\t.zero\t";
5532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AsciiDirective = "\t.ascii\t";
5632b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AscizDirective = "\t.asciz\t";
5732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data8bitsDirective = "\t.byte\t";
5832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data16bitsDirective = "\t.short\t";
5932b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data32bitsDirective = "\t.long\t";
6032b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  Data64bitsDirective = "\t.quad\t";
615277b22687d3513dd29d5a9c8510cac740f933f6Chris Lattner  SunStyleELFSectionSwitchSyntax = false;
62fdf229eda95a542fc34d5182e1a91a22789ba122Bruno Cardoso Lopes  UsesELFSectionDirectiveForBSS = false;
6332b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AlignDirective = "\t.align\t";
6432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  AlignmentIsInBytes = true;
6532b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  TextAlignFillValue = 0;
666c2cf8b1fbcf70fd9db6fe44032c1ceaa2299760Akira Hatanaka  GPRel64Directive = 0;
6778f485afb723121eedf4b6907ae6eb53da8af03cChris Lattner  GPRel32Directive = 0;
6832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  GlobalDirective = "\t.globl\t";
69cee63322eaccc2f1067bdf5eab506e440f867da1Chris Lattner  HasSetDirective = true;
7090a5a0cd7c353651c953020b1e41b4c6e2f21883Rafael Espindola  HasAggressiveSymbolFolding = true;
712e2563bf8e0f0a7f8c923000c0206855f16968b2Rafael Espindola  COMMDirectiveAlignmentIsInBytes = true;
72a9e37c5eaf79c3a32f2921536fb7e12514e86fb2Benjamin Kramer  LCOMMDirectiveAlignmentType = LCOMM::NoAlignment;
7332b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  HasDotTypeDotSizeDirective = true;
74952b839ce9bc0c6d605d8b202c9cd76f7f05a77dRafael Espindola  HasSingleParameterDotFile = true;
753a9be0ee36fe2143f514d28315f3dc1bda132b2eChris Lattner  HasNoDeadStrip = false;
76e8e98d7f2eaa0613442ce21ab6a040c0f04f5b4dKevin Enderby  HasSymbolResolver = false;
7732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  WeakRefDirective = 0;
7832b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  WeakDefDirective = 0;
7941eb8b47717e1fe1a6d0e99ec1b4e890091f77aaChris Lattner  LinkOnceDirective = 0;
80152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner  HiddenVisibilityAttr = MCSA_Hidden;
815129bdecd87c518713765acd6998c80f9eef36a2Stuart Hastings  HiddenDeclarationVisibilityAttr = MCSA_Hidden;
82152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner  ProtectedVisibilityAttr = MCSA_Protected;
8332b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  HasLEB128 = false;
8432b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  SupportsDebugInformation = false;
851b747ad8a0694b86e8d98a8b9a05ddfe74ec0cd3Jim Grosbach  ExceptionsType = ExceptionHandling::None;
860f7fef3872a37d09c806f52f1d03d74ebc73c171Devang Patel  DwarfUsesInlineInfoSection = false;
8732b952a2a60d1091e0e17bb6ce788cd1d41e6f8bAnton Korobeynikov  DwarfSectionOffsetDirective = 0;
88ffccd923101ae177c1a2c407618d8f03a312d69bNick Lewycky  DwarfUsesRelocationsAcrossSections = true;
893014b2f3228e1aac1a70598f50d66f1afcc16714Akira Hatanaka  DwarfRegNumForCFI = false;
908a29fa6e02c8a76a71f43fc8bf4e51dd12bac4bcChris Lattner  HasMicrosoftFastStdCallMangling = false;
914c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner}
92f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner
93af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris LattnerMCAsmInfo::~MCAsmInfo() {
94f5b10ec509d7e27df12372e53adeda59051dfc30Chris Lattner}
954c7b07a66f3d5c14339a6181fa12d060aeb9b18cChris Lattner
96a6199c87c293d937b1e57549864345e64e6c6e8bAnton Korobeynikov
97af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerunsigned MCAsmInfo::getULEB128Size(unsigned Value) {
98ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  unsigned Size = 0;
99ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  do {
100ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Value >>= 7;
101ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Size += sizeof(int8_t);
102ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  } while (Value);
103ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  return Size;
104ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov}
105ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov
106af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattnerunsigned MCAsmInfo::getSLEB128Size(int Value) {
107ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  unsigned Size = 0;
108ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  int Sign = Value >> (8 * sizeof(Value) - 1);
109ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  bool IsMore;
110ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov
111ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  do {
112ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    unsigned Byte = Value & 0x7f;
113ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Value >>= 7;
114ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
115ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov    Size += sizeof(int8_t);
116ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  } while (IsMore);
117ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov  return Size;
118ffe31d7bf1e070650b0ff9ebfac815ea172a82bbAnton Korobeynikov}
119bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola
120bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindolaconst MCExpr *
121bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael EspindolaMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
122debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola                                       unsigned Encoding,
123bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola                                       MCStreamer &Streamer) const {
124debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  return getExprForFDESymbol(Sym, Encoding, Streamer);
125a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola}
126a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola
127a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindolaconst MCExpr *
128a0057ca13f06b8de08483c3e3a143a7236c67097Rafael EspindolaMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
129debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola                               unsigned Encoding,
130a0057ca13f06b8de08483c3e3a143a7236c67097Rafael Espindola                               MCStreamer &Streamer) const {
131debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  if (!(Encoding & dwarf::DW_EH_PE_pcrel))
132debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola    return MCSymbolRefExpr::Create(Sym, Streamer.getContext());
133debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola
134debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  MCContext &Context = Streamer.getContext();
135debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context);
136debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  MCSymbol *PCSym = Context.CreateTempSymbol();
137debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  Streamer.EmitLabel(PCSym);
138debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, Context);
139debd7e4e8bc5cfe61bfb71835ce2b1a3fbccc2beRafael Espindola  return MCBinaryExpr::CreateSub(Res, PC, Context);
140bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola}
141