]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | //===-- X86MCAsmInfo.cpp - X86 asm properties -----------------------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | // | |
10 | // This file contains the declarations of the X86MCAsmInfo properties. | |
11 | // | |
12 | //===----------------------------------------------------------------------===// | |
13 | ||
14 | #include "X86MCAsmInfo.h" | |
15 | #include "llvm/ADT/Triple.h" | |
16 | #include "llvm/MC/MCContext.h" | |
17 | #include "llvm/MC/MCExpr.h" | |
18 | #include "llvm/MC/MCSectionELF.h" | |
19 | #include "llvm/MC/MCStreamer.h" | |
20 | #include "llvm/Support/CommandLine.h" | |
21 | #include "llvm/Support/ELF.h" | |
22 | using namespace llvm; | |
23 | ||
24 | enum AsmWriterFlavorTy { | |
25 | // Note: This numbering has to match the GCC assembler dialects for inline | |
26 | // asm alternatives to work right. | |
27 | ATT = 0, Intel = 1 | |
28 | }; | |
29 | ||
30 | static cl::opt<AsmWriterFlavorTy> | |
31 | AsmWriterFlavor("x86-asm-syntax", cl::init(ATT), | |
32 | cl::desc("Choose style of code to emit from X86 backend:"), | |
33 | cl::values(clEnumValN(ATT, "att", "Emit AT&T-style assembly"), | |
34 | clEnumValN(Intel, "intel", "Emit Intel-style assembly"), | |
35 | clEnumValEnd)); | |
36 | ||
37 | static cl::opt<bool> | |
38 | MarkedJTDataRegions("mark-data-regions", cl::init(false), | |
39 | cl::desc("Mark code section jump table data regions."), | |
40 | cl::Hidden); | |
41 | ||
42 | void X86MCAsmInfoDarwin::anchor() { } | |
43 | ||
44 | X86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &T) { | |
45 | bool is64Bit = T.getArch() == Triple::x86_64; | |
46 | if (is64Bit) | |
970d7e83 | 47 | PointerSize = CalleeSaveStackSlotSize = 8; |
223e47cc LB |
48 | |
49 | AssemblerDialect = AsmWriterFlavor; | |
50 | ||
51 | TextAlignFillValue = 0x90; | |
52 | ||
53 | if (!is64Bit) | |
54 | Data64bitsDirective = 0; // we can't emit a 64-bit unit | |
55 | ||
56 | // Use ## as a comment string so that .s files generated by llvm can go | |
57 | // through the GCC preprocessor without causing an error. This is needed | |
58 | // because "clang foo.s" runs the C preprocessor, which is usually reserved | |
59 | // for .S files on other systems. Perhaps this is because the file system | |
60 | // wasn't always case preserving or something. | |
61 | CommentString = "##"; | |
62 | PCSymbol = "."; | |
63 | ||
64 | SupportsDebugInformation = true; | |
65 | DwarfUsesInlineInfoSection = true; | |
66 | UseDataRegionDirectives = MarkedJTDataRegions; | |
67 | ||
68 | // Exceptions handling | |
69 | ExceptionsType = ExceptionHandling::DwarfCFI; | |
70 | } | |
71 | ||
72 | X86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple) | |
73 | : X86MCAsmInfoDarwin(Triple) { | |
74 | } | |
75 | ||
76 | void X86ELFMCAsmInfo::anchor() { } | |
77 | ||
78 | X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) { | |
970d7e83 LB |
79 | bool is64Bit = T.getArch() == Triple::x86_64; |
80 | bool isX32 = T.getEnvironment() == Triple::GNUX32; | |
81 | ||
82 | // For ELF, x86-64 pointer size depends on the ABI. | |
83 | // For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64 | |
84 | // with the x32 ABI, pointer size remains the default 4. | |
85 | PointerSize = (is64Bit && !isX32) ? 8 : 4; | |
86 | ||
87 | // OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI. | |
88 | CalleeSaveStackSlotSize = is64Bit ? 8 : 4; | |
223e47cc LB |
89 | |
90 | AssemblerDialect = AsmWriterFlavor; | |
91 | ||
92 | TextAlignFillValue = 0x90; | |
93 | ||
94 | PrivateGlobalPrefix = ".L"; | |
95 | WeakRefDirective = "\t.weak\t"; | |
96 | PCSymbol = "."; | |
97 | ||
98 | // Set up DWARF directives | |
99 | HasLEB128 = true; // Target asm supports leb128 directives (little-endian) | |
100 | ||
101 | // Debug Information | |
102 | SupportsDebugInformation = true; | |
103 | ||
104 | // Exceptions handling | |
105 | ExceptionsType = ExceptionHandling::DwarfCFI; | |
106 | ||
107 | // OpenBSD and Bitrig have buggy support for .quad in 32-bit mode, just split | |
108 | // into two .words. | |
109 | if ((T.getOS() == Triple::OpenBSD || T.getOS() == Triple::Bitrig) && | |
110 | T.getArch() == Triple::x86) | |
111 | Data64bitsDirective = 0; | |
112 | } | |
113 | ||
114 | const MCExpr * | |
115 | X86_64MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym, | |
116 | unsigned Encoding, | |
117 | MCStreamer &Streamer) const { | |
118 | MCContext &Context = Streamer.getContext(); | |
119 | const MCExpr *Res = | |
120 | MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, Context); | |
121 | const MCExpr *Four = MCConstantExpr::Create(4, Context); | |
122 | return MCBinaryExpr::CreateAdd(Res, Four, Context); | |
123 | } | |
124 | ||
125 | const MCSection *X86ELFMCAsmInfo:: | |
126 | getNonexecutableStackSection(MCContext &Ctx) const { | |
127 | return Ctx.getELFSection(".note.GNU-stack", ELF::SHT_PROGBITS, | |
128 | 0, SectionKind::getMetadata()); | |
129 | } | |
130 | ||
131 | void X86MCAsmInfoMicrosoft::anchor() { } | |
132 | ||
133 | X86MCAsmInfoMicrosoft::X86MCAsmInfoMicrosoft(const Triple &Triple) { | |
134 | if (Triple.getArch() == Triple::x86_64) { | |
135 | GlobalPrefix = ""; | |
136 | PrivateGlobalPrefix = ".L"; | |
137 | } | |
138 | ||
139 | AssemblerDialect = AsmWriterFlavor; | |
140 | ||
141 | TextAlignFillValue = 0x90; | |
142 | } | |
143 | ||
144 | void X86MCAsmInfoGNUCOFF::anchor() { } | |
145 | ||
146 | X86MCAsmInfoGNUCOFF::X86MCAsmInfoGNUCOFF(const Triple &Triple) { | |
147 | if (Triple.getArch() == Triple::x86_64) { | |
148 | GlobalPrefix = ""; | |
149 | PrivateGlobalPrefix = ".L"; | |
150 | } | |
151 | ||
152 | AssemblerDialect = AsmWriterFlavor; | |
153 | ||
154 | TextAlignFillValue = 0x90; | |
155 | ||
156 | // Exceptions handling | |
157 | ExceptionsType = ExceptionHandling::DwarfCFI; | |
158 | } |