1af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner//===-- X86MCAsmInfo.cpp - X86 asm properties -----------------------------===// 28e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey// 38e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey// The LLVM Compiler Infrastructure 48e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 78e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey// 88e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey//===----------------------------------------------------------------------===// 98e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey// 10af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner// This file contains the declarations of the X86MCAsmInfo properties. 118e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey// 128e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey//===----------------------------------------------------------------------===// 138e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskey 14af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner#include "X86MCAsmInfo.h" 15a7ac47cee1a0b3f4c798ecaa22ecf9d1be9c07e6Chris Lattner#include "llvm/ADT/Triple.h" 1674aae4726a66733c5872588287535a984f9a94c7Chris Lattner#include "llvm/MC/MCContext.h" 17bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola#include "llvm/MC/MCExpr.h" 18f9f93e4388962b678fd59b7af5212d4cc0d38be2Chris Lattner#include "llvm/MC/MCSectionELF.h" 19bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola#include "llvm/MC/MCStreamer.h" 20ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner#include "llvm/Support/CommandLine.h" 21c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola#include "llvm/Support/ELF.h" 228e8de8f7765a08ab3aa4f48b302cf19ccb9740e2Jim Laskeyusing namespace llvm; 23ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner 24ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattnerenum AsmWriterFlavorTy { 25ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner // Note: This numbering has to match the GCC assembler dialects for inline 26ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner // asm alternatives to work right. 27ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner ATT = 0, Intel = 1 28ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner}; 29ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner 30ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattnerstatic cl::opt<AsmWriterFlavorTy> 31ce914b8f945bdd42126991a7fda8984681c2c067Chris LattnerAsmWriterFlavor("x86-asm-syntax", cl::init(ATT), 32ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner cl::desc("Choose style of code to emit from X86 backend:"), 33ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner cl::values(clEnumValN(ATT, "att", "Emit AT&T-style assembly"), 34ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner clEnumValN(Intel, "intel", "Emit Intel-style assembly"), 35ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner clEnumValEnd)); 36ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner 37e9525d862454674ce87a9da52b2d05915a142206Jim Grosbachstatic cl::opt<bool> 38e9525d862454674ce87a9da52b2d05915a142206Jim GrosbachMarkedJTDataRegions("mark-data-regions", cl::init(false), 39e9525d862454674ce87a9da52b2d05915a142206Jim Grosbach cl::desc("Mark code section jump table data regions."), 40e9525d862454674ce87a9da52b2d05915a142206Jim Grosbach cl::Hidden); 41ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner 422d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid X86MCAsmInfoDarwin::anchor() { } 432d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 441be0e271a07925b928ba89848934f1ea6f1854e2Evan ChengX86MCAsmInfoDarwin::X86MCAsmInfoDarwin(const Triple &T) { 451be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng bool is64Bit = T.getArch() == Triple::x86_64; 461be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng if (is64Bit) 479dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky PointerSize = CalleeSaveStackSlotSize = 8; 481be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng 49ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner AssemblerDialect = AsmWriterFlavor; 50d8cca66bb4df14b3d50fb473f27a7ef48a4fa339Eric Christopher 514468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov TextAlignFillValue = 0x90; 52f6ccee5a9d2b9573f679bca6266ade3eb8cd3f88Daniel Dunbar 534468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov if (!is64Bit) 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Data64bitsDirective = nullptr; // we can't emit a 64-bit unit 55b6be139c506f2e59a024ef7774ce5db060b83556Bill Wendling 56feeb93ecd25e34140a970b5e9ccc2e4bbb5eccf2Chris Lattner // Use ## as a comment string so that .s files generated by llvm can go 5752be68d86c1c51b25fc6626bc7e6dd8ef4463c46Chris Lattner // through the GCC preprocessor without causing an error. This is needed 5852be68d86c1c51b25fc6626bc7e6dd8ef4463c46Chris Lattner // because "clang foo.s" runs the C preprocessor, which is usually reserved 5952be68d86c1c51b25fc6626bc7e6dd8ef4463c46Chris Lattner // for .S files on other systems. Perhaps this is because the file system 6052be68d86c1c51b25fc6626bc7e6dd8ef4463c46Chris Lattner // wasn't always case preserving or something. 614468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov CommentString = "##"; 624468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 634468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov SupportsDebugInformation = true; 64e9525d862454674ce87a9da52b2d05915a142206Jim Grosbach UseDataRegionDirectives = MarkedJTDataRegions; 654468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 664468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Exceptions handling 67450a5a120789b67b27f92631e0acaf754ee99d9eRafael Espindola ExceptionsType = ExceptionHandling::DwarfCFI; 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // old assembler lacks some directives 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: this should really be a check on the assembler characteristics 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // rather than OS version 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (T.isMacOSX() && T.isMacOSXVersionLT(10, 6)) 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines HasWeakDefCanBeHiddenDirective = false; 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: this should not depend on the target OS version, but on the ld64 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // version in use. From at least >= ld64-97.17 (Xcode 3.2.6) the abs-ified 77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines // FDE relocs may be used. We also use them for the ios simulator. 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DwarfFDESymbolsUseAbsDiff = (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) 79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines || T.isiOS(); 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines UseIntegratedAssembler = true; 824468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov} 834468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 84bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael EspindolaX86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple) 85bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola : X86MCAsmInfoDarwin(Triple) { 86bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola} 87bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola 882d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid X86ELFMCAsmInfo::anchor() { } 892d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 90bcc5cb406172edcb68598e9578bab9ed9bd0de85Chris LattnerX86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) { 919dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky bool is64Bit = T.getArch() == Triple::x86_64; 929dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky bool isX32 = T.getEnvironment() == Triple::GNUX32; 939dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky 949dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // For ELF, x86-64 pointer size depends on the ABI. 959dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64 969dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // with the x32 ABI, pointer size remains the default 4. 979dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky PointerSize = (is64Bit && !isX32) ? 8 : 4; 989dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky 999dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI. 1009dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky CalleeSaveStackSlotSize = is64Bit ? 8 : 4; 1011be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng 102ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner AssemblerDialect = AsmWriterFlavor; 1030d44ba82b433d586f37e5f83f97fb1fddba35587Anton Korobeynikov 104010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar TextAlignFillValue = 0x90; 105010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar 1064468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Set up DWARF directives 1074468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov HasLEB128 = true; // Target asm supports leb128 directives (little-endian) 1084468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1094468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Debug Information 1104468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov SupportsDebugInformation = true; 1114468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1124468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Exceptions handling 113f0adba9a7ec8a3031876575a6ffb7db5f1b6f855Rafael Espindola ExceptionsType = ExceptionHandling::DwarfCFI; 114f0adba9a7ec8a3031876575a6ffb7db5f1b6f855Rafael Espindola 115b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher // OpenBSD and Bitrig have buggy support for .quad in 32-bit mode, just split 116b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher // into two .words. 117b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher if ((T.getOS() == Triple::OpenBSD || T.getOS() == Triple::Bitrig) && 118b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher T.getArch() == Triple::x86) 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Data64bitsDirective = nullptr; 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Always enable the integrated assembler by default. 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // Clang also enabled it when the OS is Solaris but that is redundant here. 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines UseIntegratedAssembler = true; 124f9f93e4388962b678fd59b7af5212d4cc0d38be2Chris Lattner} 1254468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1261be0e271a07925b928ba89848934f1ea6f1854e2Evan Chengconst MCExpr * 1271be0e271a07925b928ba89848934f1ea6f1854e2Evan ChengX86_64MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym, 1281be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng unsigned Encoding, 1291be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng MCStreamer &Streamer) const { 1301be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng MCContext &Context = Streamer.getContext(); 1311be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng const MCExpr *Res = 1321be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, Context); 1331be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng const MCExpr *Four = MCConstantExpr::Create(4, Context); 1341be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng return MCBinaryExpr::CreateAdd(Res, Four, Context); 1351be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng} 1361be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng 13774aae4726a66733c5872588287535a984f9a94c7Chris Lattnerconst MCSection *X86ELFMCAsmInfo:: 13874aae4726a66733c5872588287535a984f9a94c7Chris LattnergetNonexecutableStackSection(MCContext &Ctx) const { 139c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return Ctx.getELFSection(".note.GNU-stack", ELF::SHT_PROGBITS, 1403f2d13c98eb04962bf6fcfdcc6f62789bc820d79Rafael Espindola 0, SectionKind::getMetadata()); 1414468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov} 1424468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1432d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid X86MCAsmInfoMicrosoft::anchor() { } 1442d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 145116bc795da4b10773235a89cc251d31651b3851dMichael J. SpencerX86MCAsmInfoMicrosoft::X86MCAsmInfoMicrosoft(const Triple &Triple) { 146cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (Triple.getArch() == Triple::x86_64) { 147116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer PrivateGlobalPrefix = ".L"; 148cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines PointerSize = 8; 149cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ExceptionsType = ExceptionHandling::WinEH; 150cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 151116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer 152116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer AssemblerDialect = AsmWriterFlavor; 153116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer 154116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer TextAlignFillValue = 0x90; 15522f9dd4591e8af6d6feed10a4b6e11a784582edcHans Wennborg 15622f9dd4591e8af6d6feed10a4b6e11a784582edcHans Wennborg AllowAtInName = true; 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines UseIntegratedAssembler = true; 159116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer} 160116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer 1612d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid X86MCAsmInfoGNUCOFF::anchor() { } 1622d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 163116bc795da4b10773235a89cc251d31651b3851dMichael J. SpencerX86MCAsmInfoGNUCOFF::X86MCAsmInfoGNUCOFF(const Triple &Triple) { 164cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines assert(Triple.isOSWindows() && "Windows is the only supported COFF target"); 165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Triple.getArch() == Triple::x86_64) { 16663fbb521631e4a4a20e26a8c950d7449b85834eaNAKAMURA Takumi PrivateGlobalPrefix = ".L"; 167dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines PointerSize = 8; 168cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ExceptionsType = ExceptionHandling::WinEH; 169cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } else { 170cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ExceptionsType = ExceptionHandling::DwarfCFI; 171dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 172da0bfcdaf95d95a66e306ef6d45f638939272d34Michael J. Spencer 173ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner AssemblerDialect = AsmWriterFlavor; 174010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar 175010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar TextAlignFillValue = 0x90; 176847307a35b33bf3b9c68510c71b41794de9f2ccaNAKAMURA Takumi 17736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines UseIntegratedAssembler = true; 17830fb00aac02682cf1edef9f89b905621aa7a3c04Benjamin Kramer} 179