X86MCAsmInfo.cpp revision 288943
1251881Speter//===-- X86MCAsmInfo.cpp - X86 asm properties -----------------------------===//
2251881Speter//
3251881Speter//                     The LLVM Compiler Infrastructure
4251881Speter//
5251881Speter// This file is distributed under the University of Illinois Open Source
6251881Speter// License. See LICENSE.TXT for details.
7251881Speter//
8251881Speter//===----------------------------------------------------------------------===//
9251881Speter//
10251881Speter// This file contains the declarations of the X86MCAsmInfo properties.
11251881Speter//
12251881Speter//===----------------------------------------------------------------------===//
13251881Speter
14251881Speter#include "X86MCAsmInfo.h"
15251881Speter#include "llvm/ADT/Triple.h"
16251881Speter#include "llvm/MC/MCContext.h"
17251881Speter#include "llvm/MC/MCExpr.h"
18251881Speter#include "llvm/MC/MCSectionELF.h"
19251881Speter#include "llvm/MC/MCStreamer.h"
20251881Speter#include "llvm/Support/CommandLine.h"
21251881Speter#include "llvm/Support/ELF.h"
22251881Speterusing namespace llvm;
23251881Speter
24251881Speterenum AsmWriterFlavorTy {
25251881Speter  // Note: This numbering has to match the GCC assembler dialects for inline
26251881Speter  // asm alternatives to work right.
27251881Speter  ATT = 0, Intel = 1
28251881Speter};
29251881Speter
30251881Speterstatic cl::opt<AsmWriterFlavorTy>
31251881SpeterAsmWriterFlavor("x86-asm-syntax", cl::init(ATT),
32251881Speter  cl::desc("Choose style of code to emit from X86 backend:"),
33251881Speter  cl::values(clEnumValN(ATT,   "att",   "Emit AT&T-style assembly"),
34251881Speter             clEnumValN(Intel, "intel", "Emit Intel-style assembly"),
35251881Speter             clEnumValEnd));
36251881Speter
37251881Speterstatic cl::opt<bool>
38251881SpeterMarkedJTDataRegions("mark-data-regions", cl::init(false),
39251881Speter  cl::desc("Mark code section jump table data regions."),
40251881Speter  cl::Hidden);
41251881Speter
42251881Spetervoid X86MCAsmInfoDarwin::anchor() { }
43251881Speter
44251881SpeterX86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &T) {
45251881Speter  bool is64Bit = T.getArch() == Triple::x86_64;
46251881Speter  if (is64Bit)
47251881Speter    PointerSize = CalleeSaveStackSlotSize = 8;
48251881Speter
49251881Speter  AssemblerDialect = AsmWriterFlavor;
50251881Speter
51251881Speter  TextAlignFillValue = 0x90;
52251881Speter
53251881Speter  if (!is64Bit)
54251881Speter    Data64bitsDirective = nullptr;       // we can't emit a 64-bit unit
55251881Speter
56251881Speter  // Use ## as a comment string so that .s files generated by llvm can go
57251881Speter  // through the GCC preprocessor without causing an error.  This is needed
58251881Speter  // because "clang foo.s" runs the C preprocessor, which is usually reserved
59251881Speter  // for .S files on other systems.  Perhaps this is because the file system
60251881Speter  // wasn't always case preserving or something.
61251881Speter  CommentString = "##";
62251881Speter
63251881Speter  SupportsDebugInformation = true;
64251881Speter  UseDataRegionDirectives = MarkedJTDataRegions;
65251881Speter
66251881Speter  // Exceptions handling
67251881Speter  ExceptionsType = ExceptionHandling::DwarfCFI;
68251881Speter
69251881Speter  // old assembler lacks some directives
70251881Speter  // FIXME: this should really be a check on the assembler characteristics
71251881Speter  // rather than OS version
72251881Speter  if (T.isMacOSX() && T.isMacOSXVersionLT(10, 6))
73251881Speter    HasWeakDefCanBeHiddenDirective = false;
74251881Speter
75251881Speter  // Assume ld64 is new enough that the abs-ified FDE relocs may be used
76251881Speter  // (actually, must, since otherwise the non-extern relocations we produce
77251881Speter  // overwhelm ld64's tiny little mind and it fails).
78251881Speter  DwarfFDESymbolsUseAbsDiff = true;
79251881Speter
80251881Speter  UseIntegratedAssembler = true;
81251881Speter}
82251881Speter
83251881SpeterX86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple)
84251881Speter  : X86MCAsmInfoDarwin(Triple) {
85251881Speter}
86251881Speter
87251881Spetervoid X86ELFMCAsmInfo::anchor() { }
88251881Speter
89251881SpeterX86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) {
90251881Speter  bool is64Bit = T.getArch() == Triple::x86_64;
91251881Speter  bool isX32 = T.getEnvironment() == Triple::GNUX32;
92251881Speter
93251881Speter  // For ELF, x86-64 pointer size depends on the ABI.
94251881Speter  // For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64
95251881Speter  // with the x32 ABI, pointer size remains the default 4.
96251881Speter  PointerSize = (is64Bit && !isX32) ? 8 : 4;
97251881Speter
98251881Speter  // OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI.
99251881Speter  CalleeSaveStackSlotSize = is64Bit ? 8 : 4;
100251881Speter
101251881Speter  AssemblerDialect = AsmWriterFlavor;
102251881Speter
103251881Speter  TextAlignFillValue = 0x90;
104251881Speter
105251881Speter  // Debug Information
106251881Speter  SupportsDebugInformation = true;
107251881Speter
108251881Speter  // Exceptions handling
109251881Speter  ExceptionsType = ExceptionHandling::DwarfCFI;
110251881Speter
111251881Speter  // Always enable the integrated assembler by default.
112251881Speter  // Clang also enabled it when the OS is Solaris but that is redundant here.
113251881Speter  UseIntegratedAssembler = true;
114251881Speter}
115251881Speter
116251881Speterconst MCExpr *
117251881SpeterX86_64MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym,
118251881Speter                                                   unsigned Encoding,
119251881Speter                                                   MCStreamer &Streamer) const {
120251881Speter  MCContext &Context = Streamer.getContext();
121251881Speter  const MCExpr *Res =
122251881Speter    MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, Context);
123251881Speter  const MCExpr *Four = MCConstantExpr::create(4, Context);
124251881Speter  return MCBinaryExpr::createAdd(Res, Four, Context);
125251881Speter}
126251881Speter
127251881Spetervoid X86MCAsmInfoMicrosoft::anchor() { }
128251881Speter
129251881SpeterX86MCAsmInfoMicrosoft::X86MCAsmInfoMicrosoft(const Triple &Triple) {
130251881Speter  if (Triple.getArch() == Triple::x86_64) {
131251881Speter    PrivateGlobalPrefix = ".L";
132251881Speter    PrivateLabelPrefix = ".L";
133251881Speter    PointerSize = 8;
134251881Speter    WinEHEncodingType = WinEH::EncodingType::Itanium;
135251881Speter  } else {
136251881Speter    // 32-bit X86 doesn't use CFI, so this isn't a real encoding type. It's just
137251881Speter    // a place holder that the Windows EHStreamer looks for to suppress CFI
138251881Speter    // output. In particular, usesWindowsCFI() returns false.
139251881Speter    WinEHEncodingType = WinEH::EncodingType::X86;
140251881Speter  }
141251881Speter
142251881Speter  ExceptionsType = ExceptionHandling::WinEH;
143251881Speter
144251881Speter  AssemblerDialect = AsmWriterFlavor;
145251881Speter
146251881Speter  TextAlignFillValue = 0x90;
147251881Speter
148251881Speter  AllowAtInName = true;
149251881Speter
150251881Speter  UseIntegratedAssembler = true;
151251881Speter}
152251881Speter
153251881Spetervoid X86MCAsmInfoGNUCOFF::anchor() { }
154251881Speter
155251881SpeterX86MCAsmInfoGNUCOFF::X86MCAsmInfoGNUCOFF(const Triple &Triple) {
156251881Speter  assert(Triple.isOSWindows() && "Windows is the only supported COFF target");
157251881Speter  if (Triple.getArch() == Triple::x86_64) {
158251881Speter    PrivateGlobalPrefix = ".L";
159251881Speter    PrivateLabelPrefix = ".L";
160251881Speter    PointerSize = 8;
161251881Speter    WinEHEncodingType = WinEH::EncodingType::Itanium;
162251881Speter    ExceptionsType = ExceptionHandling::WinEH;
163251881Speter  } else {
164251881Speter    ExceptionsType = ExceptionHandling::DwarfCFI;
165251881Speter  }
166251881Speter
167251881Speter  AssemblerDialect = AsmWriterFlavor;
168251881Speter
169251881Speter  TextAlignFillValue = 0x90;
170251881Speter
171251881Speter  UseIntegratedAssembler = true;
172251881Speter}
173251881Speter