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) 544468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov Data64bitsDirective = 0; // 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 PCSymbol = "."; 634468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 644468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov SupportsDebugInformation = true; 650f7fef3872a37d09c806f52f1d03d74ebc73c171Devang Patel DwarfUsesInlineInfoSection = true; 66e9525d862454674ce87a9da52b2d05915a142206Jim Grosbach UseDataRegionDirectives = MarkedJTDataRegions; 674468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 684468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Exceptions handling 69450a5a120789b67b27f92631e0acaf754ee99d9eRafael Espindola ExceptionsType = ExceptionHandling::DwarfCFI; 704468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov} 714468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 72bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael EspindolaX86_64MCAsmInfoDarwin::X86_64MCAsmInfoDarwin(const Triple &Triple) 73bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola : X86MCAsmInfoDarwin(Triple) { 74bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola} 75bfa27cc5d72e061a96efbb461864d40bc8089ec2Rafael Espindola 762d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid X86ELFMCAsmInfo::anchor() { } 772d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 78bcc5cb406172edcb68598e9578bab9ed9bd0de85Chris LattnerX86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) { 799dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky bool is64Bit = T.getArch() == Triple::x86_64; 809dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky bool isX32 = T.getEnvironment() == Triple::GNUX32; 819dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky 829dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // For ELF, x86-64 pointer size depends on the ABI. 839dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64 849dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // with the x32 ABI, pointer size remains the default 4. 859dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky PointerSize = (is64Bit && !isX32) ? 8 : 4; 869dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky 879dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky // OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI. 889dd2a3b1f2c253e20262535bb89b1ab6cc680eceEli Bendersky CalleeSaveStackSlotSize = is64Bit ? 8 : 4; 891be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng 90ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner AssemblerDialect = AsmWriterFlavor; 910d44ba82b433d586f37e5f83f97fb1fddba35587Anton Korobeynikov 92010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar TextAlignFillValue = 0x90; 93010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar 944468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov PrivateGlobalPrefix = ".L"; 954468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov WeakRefDirective = "\t.weak\t"; 964468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov PCSymbol = "."; 974468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 984468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Set up DWARF directives 994468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov HasLEB128 = true; // Target asm supports leb128 directives (little-endian) 1004468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1014468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Debug Information 1024468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov SupportsDebugInformation = true; 1034468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1044468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov // Exceptions handling 105f0adba9a7ec8a3031876575a6ffb7db5f1b6f855Rafael Espindola ExceptionsType = ExceptionHandling::DwarfCFI; 106f0adba9a7ec8a3031876575a6ffb7db5f1b6f855Rafael Espindola 107b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher // OpenBSD and Bitrig have buggy support for .quad in 32-bit mode, just split 108b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher // into two .words. 109b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher if ((T.getOS() == Triple::OpenBSD || T.getOS() == Triple::Bitrig) && 110b0f6759ab93b42570d71665b13d24ca2c4a5f276Eric Christopher T.getArch() == Triple::x86) 111bcc5cb406172edcb68598e9578bab9ed9bd0de85Chris Lattner Data64bitsDirective = 0; 112f9f93e4388962b678fd59b7af5212d4cc0d38be2Chris Lattner} 1134468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1141be0e271a07925b928ba89848934f1ea6f1854e2Evan Chengconst MCExpr * 1151be0e271a07925b928ba89848934f1ea6f1854e2Evan ChengX86_64MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym, 1161be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng unsigned Encoding, 1171be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng MCStreamer &Streamer) const { 1181be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng MCContext &Context = Streamer.getContext(); 1191be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng const MCExpr *Res = 1201be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, Context); 1211be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng const MCExpr *Four = MCConstantExpr::Create(4, Context); 1221be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng return MCBinaryExpr::CreateAdd(Res, Four, Context); 1231be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng} 1241be0e271a07925b928ba89848934f1ea6f1854e2Evan Cheng 12574aae4726a66733c5872588287535a984f9a94c7Chris Lattnerconst MCSection *X86ELFMCAsmInfo:: 12674aae4726a66733c5872588287535a984f9a94c7Chris LattnergetNonexecutableStackSection(MCContext &Ctx) const { 127c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola return Ctx.getELFSection(".note.GNU-stack", ELF::SHT_PROGBITS, 1283f2d13c98eb04962bf6fcfdcc6f62789bc820d79Rafael Espindola 0, SectionKind::getMetadata()); 1294468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov} 1304468b7a988b09ceb9f2772d7af948847afd3bb7dAnton Korobeynikov 1312d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid X86MCAsmInfoMicrosoft::anchor() { } 1322d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 133116bc795da4b10773235a89cc251d31651b3851dMichael J. SpencerX86MCAsmInfoMicrosoft::X86MCAsmInfoMicrosoft(const Triple &Triple) { 134116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer if (Triple.getArch() == Triple::x86_64) { 135116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer GlobalPrefix = ""; 136116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer PrivateGlobalPrefix = ".L"; 137116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer } 138116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer 139116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer AssemblerDialect = AsmWriterFlavor; 140116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer 141116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer TextAlignFillValue = 0x90; 142116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer} 143116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer 1442d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid X86MCAsmInfoGNUCOFF::anchor() { } 1452d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 146116bc795da4b10773235a89cc251d31651b3851dMichael J. SpencerX86MCAsmInfoGNUCOFF::X86MCAsmInfoGNUCOFF(const Triple &Triple) { 14763fbb521631e4a4a20e26a8c950d7449b85834eaNAKAMURA Takumi if (Triple.getArch() == Triple::x86_64) { 148da0bfcdaf95d95a66e306ef6d45f638939272d34Michael J. Spencer GlobalPrefix = ""; 14963fbb521631e4a4a20e26a8c950d7449b85834eaNAKAMURA Takumi PrivateGlobalPrefix = ".L"; 15063fbb521631e4a4a20e26a8c950d7449b85834eaNAKAMURA Takumi } 151da0bfcdaf95d95a66e306ef6d45f638939272d34Michael J. Spencer 152ce914b8f945bdd42126991a7fda8984681c2c067Chris Lattner AssemblerDialect = AsmWriterFlavor; 153010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar 154010b1b2a0db5fe732b0d5d7c4ca15ae364ebe248Daniel Dunbar TextAlignFillValue = 0x90; 155847307a35b33bf3b9c68510c71b41794de9f2ccaNAKAMURA Takumi 156847307a35b33bf3b9c68510c71b41794de9f2ccaNAKAMURA Takumi // Exceptions handling 157847307a35b33bf3b9c68510c71b41794de9f2ccaNAKAMURA Takumi ExceptionsType = ExceptionHandling::DwarfCFI; 15830fb00aac02682cf1edef9f89b905621aa7a3c04Benjamin Kramer} 159