StringRef ARM::computeDefaultTargetABI(const Triple &TT, StringRef CPU) { StringRef ArchName = CPU.empty() ? TT.getArchName() : getArchName(parseCPUArch(CPU)); if (TT.isOSBinFormatMachO()) { if (TT.getEnvironment() == Triple::EABI || TT.getOS() == Triple::UnknownOS || parseArchProfile(ArchName) == ProfileKind::M) return "aapcs"; if (TT.isWatchABI()) return "aapcs16"; return "apcs-gnu"; } else if (TT.isOSWindows()) // FIXME: this is invalid for WindowsCE. return "aapcs"; // Select the default based on the platform. switch (TT.getEnvironment()) { case Triple::Android: case Triple::GNUEABI: case Triple::GNUEABIHF: case Triple::MuslEABI: case Triple::MuslEABIHF: return "aapcs-linux"; case Triple::EABIHF: case Triple::EABI: return "aapcs"; default: if (TT.isOSNetBSD()) return "apcs-gnu"; if (TT.isOSOpenBSD()) return "aapcs-linux"; return "aapcs"; } }
static ARMBaseTargetMachine::ARMABI computeTargetABI(const Triple &TT, StringRef CPU, const TargetOptions &Options) { if (Options.MCOptions.getABIName() == "aapcs16") return ARMBaseTargetMachine::ARM_ABI_AAPCS16; else if (Options.MCOptions.getABIName().startswith("aapcs")) return ARMBaseTargetMachine::ARM_ABI_AAPCS; else if (Options.MCOptions.getABIName().startswith("apcs")) return ARMBaseTargetMachine::ARM_ABI_APCS; assert(Options.MCOptions.getABIName().empty() && "Unknown target-abi option!"); ARMBaseTargetMachine::ARMABI TargetABI = ARMBaseTargetMachine::ARM_ABI_UNKNOWN; unsigned ArchKind = ARM::parseCPUArch(CPU); StringRef ArchName = ARM::getArchName(ArchKind); // FIXME: This is duplicated code from the front end and should be unified. if (TT.isOSBinFormatMachO()) { if (TT.getEnvironment() == Triple::EABI || (TT.getOS() == Triple::UnknownOS && TT.isOSBinFormatMachO()) || ARM::parseArchProfile(ArchName) == ARM::PK_M) { TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; } else if (TT.isWatchABI()) { TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS16; } else { TargetABI = ARMBaseTargetMachine::ARM_ABI_APCS; } } else if (TT.isOSWindows()) { // FIXME: this is invalid for WindowsCE TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; } else { // Select the default based on the platform. switch (TT.getEnvironment()) { case Triple::Android: case Triple::GNUEABI: case Triple::GNUEABIHF: case Triple::MuslEABI: case Triple::MuslEABIHF: case Triple::EABIHF: case Triple::EABI: TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; break; case Triple::GNU: TargetABI = ARMBaseTargetMachine::ARM_ABI_APCS; break; default: if (TT.isOSNetBSD()) TargetABI = ARMBaseTargetMachine::ARM_ABI_APCS; else TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; break; } } return TargetABI; }
static ARMBaseTargetMachine::ARMABI computeTargetABI(const Triple &TT, StringRef CPU, const TargetOptions &Options) { if (Options.MCOptions.getABIName().startswith("aapcs")) return ARMBaseTargetMachine::ARM_ABI_AAPCS; else if (Options.MCOptions.getABIName().startswith("apcs")) return ARMBaseTargetMachine::ARM_ABI_APCS; assert(Options.MCOptions.getABIName().empty() && "Unknown target-abi option!"); ARMBaseTargetMachine::ARMABI TargetABI = ARMBaseTargetMachine::ARM_ABI_UNKNOWN; // FIXME: This is duplicated code from the front end and should be unified. if (TT.isOSBinFormatMachO()) { if (TT.getEnvironment() == llvm::Triple::EABI || (TT.getOS() == llvm::Triple::UnknownOS && TT.getObjectFormat() == llvm::Triple::MachO) || CPU.startswith("cortex-m")) { TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; } else { TargetABI = ARMBaseTargetMachine::ARM_ABI_APCS; } } else if (TT.isOSWindows()) { // FIXME: this is invalid for WindowsCE TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; } else { // Select the default based on the platform. switch (TT.getEnvironment()) { case llvm::Triple::Android: case llvm::Triple::GNUEABI: case llvm::Triple::GNUEABIHF: case llvm::Triple::EABIHF: case llvm::Triple::EABI: TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; break; case llvm::Triple::GNU: TargetABI = ARMBaseTargetMachine::ARM_ABI_APCS; break; default: if (TT.getOS() == llvm::Triple::NetBSD) TargetABI = ARMBaseTargetMachine::ARM_ABI_APCS; else TargetABI = ARMBaseTargetMachine::ARM_ABI_AAPCS; break; } } return TargetABI; }
X86RegisterInfo::X86RegisterInfo(const Triple &TT) : X86GenRegisterInfo((TT.isArch64Bit() ? X86::RIP : X86::EIP), X86_MC::getDwarfRegFlavour(TT, false), X86_MC::getDwarfRegFlavour(TT, true), (TT.isArch64Bit() ? X86::RIP : X86::EIP)) { X86_MC::InitLLVM2SEHRegisterMapping(this); // Cache some information. Is64Bit = TT.isArch64Bit(); IsWin64 = Is64Bit && TT.isOSWindows(); // Use a callee-saved register as the base pointer. These registers must // not conflict with any ABI requirements. For example, in 32-bit mode PIC // requires GOT in the EBX register before function calls via PLT GOT pointer. if (Is64Bit) { SlotSize = 8; // This matches the simplified 32-bit pointer code in the data layout // computation. // FIXME: Should use the data layout? bool Use64BitReg = TT.getEnvironment() != Triple::GNUX32; StackPtr = Use64BitReg ? X86::RSP : X86::ESP; FramePtr = Use64BitReg ? X86::RBP : X86::EBP; BasePtr = Use64BitReg ? X86::RBX : X86::EBX; } else { SlotSize = 4; StackPtr = X86::ESP; FramePtr = X86::EBP; BasePtr = X86::ESI; } }
X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) { bool is64Bit = T.getArch() == Triple::x86_64; bool isX32 = T.getEnvironment() == Triple::GNUX32; // For ELF, x86-64 pointer size depends on the ABI. // For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64 // with the x32 ABI, pointer size remains the default 4. PointerSize = (is64Bit && !isX32) ? 8 : 4; // OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI. CalleeSaveStackSlotSize = is64Bit ? 8 : 4; AssemblerDialect = AsmWriterFlavor; TextAlignFillValue = 0x90; // Debug Information SupportsDebugInformation = true; // Exceptions handling ExceptionsType = ExceptionHandling::DwarfCFI; // Always enable the integrated assembler by default. // Clang also enabled it when the OS is Solaris but that is redundant here. UseIntegratedAssembler = true; }
X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) { bool is64Bit = T.getArch() == Triple::x86_64; bool isX32 = T.getEnvironment() == Triple::GNUX32; // For ELF, x86-64 pointer size depends on the ABI. // For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64 // with the x32 ABI, pointer size remains the default 4. PointerSize = (is64Bit && !isX32) ? 8 : 4; // OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI. CalleeSaveStackSlotSize = is64Bit ? 8 : 4; AssemblerDialect = AsmWriterFlavor; TextAlignFillValue = 0x90; // Debug Information SupportsDebugInformation = true; // Exceptions handling ExceptionsType = ExceptionHandling::DwarfCFI; // OpenBSD and Bitrig have buggy support for .quad in 32-bit mode, just split // into two .words. if ((T.isOSOpenBSD() || T.isOSBitrig()) && T.getArch() == Triple::x86) Data64bitsDirective = nullptr; // Always enable the integrated assembler by default. // Clang also enabled it when the OS is Solaris but that is redundant here. UseIntegratedAssembler = true; }
X86ELFMCAsmInfo::X86ELFMCAsmInfo(const Triple &T) { bool is64Bit = T.getArch() == Triple::x86_64; bool isX32 = T.getEnvironment() == Triple::GNUX32; // For ELF, x86-64 pointer size depends on the ABI. // For x86-64 without the x32 ABI, pointer size is 8. For x86 and for x86-64 // with the x32 ABI, pointer size remains the default 4. PointerSize = (is64Bit && !isX32) ? 8 : 4; // OTOH, stack slot size is always 8 for x86-64, even with the x32 ABI. CalleeSaveStackSlotSize = is64Bit ? 8 : 4; AssemblerDialect = AsmWriterFlavor; TextAlignFillValue = 0x90; PrivateGlobalPrefix = ".L"; WeakRefDirective = "\t.weak\t"; // Set up DWARF directives HasLEB128 = true; // Target asm supports leb128 directives (little-endian) // Debug Information SupportsDebugInformation = true; // Exceptions handling ExceptionsType = ExceptionHandling::DwarfCFI; // OpenBSD and Bitrig have buggy support for .quad in 32-bit mode, just split // into two .words. if ((T.getOS() == Triple::OpenBSD || T.getOS() == Triple::Bitrig) && T.getArch() == Triple::x86) Data64bitsDirective = 0; }
static FloatAbi get_float_abi(const Triple &triple) { switch (triple.getOS()) { case Triple::Darwin: case Triple::MacOSX: case Triple::IOS: if (get_arm_sub_arch_version(triple) == 6 || get_arm_sub_arch_version(triple) == 7) { return FloatAbiSoftFp; } else { return FloatAbiSoft; } case Triple::Win32: return FloatAbiHard; case Triple::FreeBSD: switch (triple.getEnvironment()) { case Triple::GNUEABIHF: return FloatAbiHard; default: return FloatAbiSoft; } default: switch (triple.getEnvironment()) { case Triple::GNUEABIHF: return FloatAbiHard; case Triple::GNUEABI: return FloatAbiSoftFp; case Triple::EABIHF: return FloatAbiHard; case Triple::EABI: return FloatAbiSoftFp; case Triple::Android: if (get_arm_sub_arch_version(triple) == 7) { return FloatAbiSoftFp; } else { return FloatAbiSoft; } default: return FloatAbiSoft; } } }
std::string X86_MC::ParseX86Triple(const Triple &TT) { std::string FS; if (TT.getArch() == Triple::x86_64) FS = "+64bit-mode,-32bit-mode,-16bit-mode"; else if (TT.getEnvironment() != Triple::CODE16) FS = "-64bit-mode,+32bit-mode,-16bit-mode"; else FS = "-64bit-mode,-32bit-mode,+16bit-mode"; return FS; }
// This is intended for platform as a temporary "XFAIL" bool isUnsupportedOSOrEnvironment() { Triple Host(Triple::normalize(sys::getProcessTriple())); if (find(UnsupportedEnvironments, Host.getEnvironment()) != UnsupportedEnvironments.end()) return true; if (is_contained(UnsupportedOSs, Host.getOS())) return true; if (is_contained(UnsupportedArchs, Host.getArch())) return true; return false; }
MipsABIInfo MipsABIInfo::computeTargetABI(const Triple &TT, StringRef CPU, const MCTargetOptions &Options) { if (Options.getABIName().startswith("o32")) return MipsABIInfo::O32(); if (Options.getABIName().startswith("n32")) return MipsABIInfo::N32(); if (Options.getABIName().startswith("n64")) return MipsABIInfo::N64(); if (TT.getEnvironment() == llvm::Triple::GNUABIN32) return MipsABIInfo::N32(); assert(Options.getABIName().empty() && "Unknown ABI option for MIPS"); if (TT.isMIPS64()) return MipsABIInfo::N64(); return MipsABIInfo::O32(); }
// This is intended for platform as a temporary "XFAIL" bool isUnsupportedOSOrEnvironment() { Triple Host(Triple::normalize(sys::getProcessTriple())); if (std::find(UnsupportedEnvironments.begin(), UnsupportedEnvironments.end(), Host.getEnvironment()) != UnsupportedEnvironments.end()) return true; if (std::find(UnsupportedOSs.begin(), UnsupportedOSs.end(), Host.getOS()) != UnsupportedOSs.end()) return true; if (std::find(UnsupportedArchs.begin(), UnsupportedArchs.end(), Host.getArch()) != UnsupportedArchs.end()) return true; return false; }
static std::string computeDataLayout(const Triple &TT) { // X86 is little endian std::string Ret = "e"; Ret += DataLayout::getManglingComponent(TT); // X86 and x32 have 32 bit pointers. if ((TT.isArch64Bit() && (TT.getEnvironment() == Triple::GNUX32 || TT.isOSNaCl())) || !TT.isArch64Bit()) Ret += "-p:32:32"; // Some ABIs align 64 bit integers and doubles to 64 bits, others to 32. if (TT.isArch64Bit() || TT.isOSWindows() || TT.isOSNaCl()) Ret += "-i64:64"; else if (TT.isOSIAMCU()) Ret += "-i64:32-f64:32"; else Ret += "-f64:32:64"; // Some ABIs align long double to 128 bits, others to 32. if (TT.isOSNaCl() || TT.isOSIAMCU()) ; // No f80 else if (TT.isArch64Bit() || TT.isOSDarwin()) Ret += "-f80:128"; else Ret += "-f80:32"; if (TT.isOSIAMCU()) Ret += "-f128:32"; // The registers can hold 8, 16, 32 or, in x86-64, 64 bits. if (TT.isArch64Bit()) Ret += "-n8:16:32:64"; else Ret += "-n8:16:32"; // The stack is aligned to 32 bits on some ABIs and 128 bits on others. if ((!TT.isArch64Bit() && TT.isOSWindows()) || TT.isOSIAMCU()) Ret += "-a:0:32-S32"; else Ret += "-S128"; return Ret; }