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(StringRef TT)22ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(StringRef TT) { 23 Triple TheTriple(TT); 24 if ((TheTriple.getArch() == Triple::armeb) || 25 (TheTriple.getArch() == Triple::thumbeb)) 26 IsLittleEndian = false; 27 28 Data64bitsDirective = nullptr; 29 CommentString = "@"; 30 Code16Directive = ".code\t16"; 31 Code32Directive = ".code\t32"; 32 UseDataRegionDirectives = true; 33 34 SupportsDebugInformation = true; 35 36 // Exceptions handling 37 ExceptionsType = ExceptionHandling::SjLj; 38 39 UseIntegratedAssembler = true; 40 } 41 anchor()42void ARMELFMCAsmInfo::anchor() { } 43 ARMELFMCAsmInfo(StringRef TT)44ARMELFMCAsmInfo::ARMELFMCAsmInfo(StringRef TT) { 45 Triple TheTriple(TT); 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::NetBSD: 63 ExceptionsType = ExceptionHandling::DwarfCFI; 64 break; 65 default: 66 ExceptionsType = ExceptionHandling::ARM; 67 break; 68 } 69 70 // foo(plt) instead of foo@plt 71 UseParensForSymbolVariant = true; 72 73 UseIntegratedAssembler = true; 74 } 75 setUseIntegratedAssembler(bool Value)76void ARMELFMCAsmInfo::setUseIntegratedAssembler(bool Value) { 77 UseIntegratedAssembler = Value; 78 if (!UseIntegratedAssembler) { 79 // gas doesn't handle VFP register names in cfi directives, 80 // so don't use register names with external assembler. 81 // See https://sourceware.org/bugzilla/show_bug.cgi?id=16694 82 DwarfRegNumForCFI = true; 83 } 84 } 85 anchor()86void ARMCOFFMCAsmInfoMicrosoft::anchor() { } 87 ARMCOFFMCAsmInfoMicrosoft()88ARMCOFFMCAsmInfoMicrosoft::ARMCOFFMCAsmInfoMicrosoft() { 89 AlignmentIsInBytes = false; 90 91 PrivateGlobalPrefix = "$M"; 92 PrivateLabelPrefix = "$M"; 93 } 94 anchor()95void ARMCOFFMCAsmInfoGNU::anchor() { } 96 ARMCOFFMCAsmInfoGNU()97ARMCOFFMCAsmInfoGNU::ARMCOFFMCAsmInfoGNU() { 98 AlignmentIsInBytes = false; 99 HasSingleParameterDotFile = true; 100 101 CommentString = "@"; 102 Code16Directive = ".code\t16"; 103 Code32Directive = ".code\t32"; 104 PrivateGlobalPrefix = ".L"; 105 PrivateLabelPrefix = ".L"; 106 107 SupportsDebugInformation = true; 108 ExceptionsType = ExceptionHandling::None; 109 UseParensForSymbolVariant = true; 110 111 UseIntegratedAssembler = false; 112 DwarfRegNumForCFI = true; 113 } 114 115