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