1 //===-- ARMMCAsmInfo.cpp - ARM 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 ARMMCAsmInfo properties. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "ARMMCAsmInfo.h" 15 #include "llvm/ADT/Triple.h" 16 #include "llvm/Support/CommandLine.h" 17 18 using namespace llvm; 19 anchor()20void ARMMCAsmInfoDarwin::anchor() { } 21 ARMMCAsmInfoDarwin(const Triple & TheTriple)22ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(const Triple &TheTriple) { 23 if ((TheTriple.getArch() == Triple::armeb) || 24 (TheTriple.getArch() == Triple::thumbeb)) 25 IsLittleEndian = false; 26 27 Data64bitsDirective = nullptr; 28 CommentString = "@"; 29 Code16Directive = ".code\t16"; 30 Code32Directive = ".code\t32"; 31 UseDataRegionDirectives = true; 32 33 SupportsDebugInformation = true; 34 35 // Exceptions handling 36 ExceptionsType = TheTriple.isOSDarwin() && !TheTriple.isWatchOS() 37 ? ExceptionHandling::SjLj 38 : ExceptionHandling::DwarfCFI; 39 40 UseIntegratedAssembler = true; 41 } 42 anchor()43void ARMELFMCAsmInfo::anchor() { } 44 ARMELFMCAsmInfo(const Triple & TheTriple)45ARMELFMCAsmInfo::ARMELFMCAsmInfo(const Triple &TheTriple) { 46 if ((TheTriple.getArch() == Triple::armeb) || 47 (TheTriple.getArch() == Triple::thumbeb)) 48 IsLittleEndian = false; 49 50 // ".comm align is in bytes but .align is pow-2." 51 AlignmentIsInBytes = false; 52 53 Data64bitsDirective = nullptr; 54 CommentString = "@"; 55 Code16Directive = ".code\t16"; 56 Code32Directive = ".code\t32"; 57 58 SupportsDebugInformation = true; 59 60 // Exceptions handling 61 switch (TheTriple.getOS()) { 62 case Triple::Bitrig: 63 case Triple::NetBSD: 64 ExceptionsType = ExceptionHandling::DwarfCFI; 65 break; 66 default: 67 ExceptionsType = ExceptionHandling::ARM; 68 break; 69 } 70 71 // foo(plt) instead of foo@plt 72 UseParensForSymbolVariant = true; 73 74 UseIntegratedAssembler = true; 75 } 76 setUseIntegratedAssembler(bool Value)77void ARMELFMCAsmInfo::setUseIntegratedAssembler(bool Value) { 78 UseIntegratedAssembler = Value; 79 if (!UseIntegratedAssembler) { 80 // gas doesn't handle VFP register names in cfi directives, 81 // so don't use register names with external assembler. 82 // See https://sourceware.org/bugzilla/show_bug.cgi?id=16694 83 DwarfRegNumForCFI = true; 84 } 85 } 86 anchor()87void ARMCOFFMCAsmInfoMicrosoft::anchor() { } 88 ARMCOFFMCAsmInfoMicrosoft()89ARMCOFFMCAsmInfoMicrosoft::ARMCOFFMCAsmInfoMicrosoft() { 90 AlignmentIsInBytes = false; 91 92 PrivateGlobalPrefix = "$M"; 93 PrivateLabelPrefix = "$M"; 94 } 95 anchor()96void ARMCOFFMCAsmInfoGNU::anchor() { } 97 ARMCOFFMCAsmInfoGNU()98ARMCOFFMCAsmInfoGNU::ARMCOFFMCAsmInfoGNU() { 99 AlignmentIsInBytes = false; 100 HasSingleParameterDotFile = true; 101 102 CommentString = "@"; 103 Code16Directive = ".code\t16"; 104 Code32Directive = ".code\t32"; 105 PrivateGlobalPrefix = ".L"; 106 PrivateLabelPrefix = ".L"; 107 108 SupportsDebugInformation = true; 109 ExceptionsType = ExceptionHandling::None; 110 UseParensForSymbolVariant = true; 111 112 UseIntegratedAssembler = false; 113 DwarfRegNumForCFI = true; 114 } 115 116