[PATCH] D98253: [clang][ARM] Refactor ComputeLLVMTriple code for ARM
This revision was automatically updated to reflect the committed changes. Closed by commit rG87358dba8182: [clang][ARM] Refactor ComputeLLVMTriple code for ARM (authored by DavidSpickett). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98253/new/ https://reviews.llvm.org/D98253 Files: clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Arch/ARM.cpp clang/lib/Driver/ToolChains/Arch/ARM.h Index: clang/lib/Driver/ToolChains/Arch/ARM.h === --- clang/lib/Driver/ToolChains/Arch/ARM.h +++ clang/lib/Driver/ToolChains/Arch/ARM.h @@ -51,7 +51,11 @@ FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); FloatABI getARMFloatABI(const Driver , const llvm::Triple , const llvm::opt::ArgList ); +void setFloatABIInTriple(const Driver , const llvm::opt::ArgList , + llvm::Triple ); ReadTPMode getReadTPMode(const Driver , const llvm::opt::ArgList ); +void setArchNameInTriple(const Driver , const llvm::opt::ArgList , + types::ID InputType, llvm::Triple ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: clang/lib/Driver/ToolChains/Arch/ARM.cpp === --- clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -166,6 +166,132 @@ return ReadTPMode::Soft; } +void arm::setArchNameInTriple(const Driver , const ArgList , + types::ID InputType, llvm::Triple ) { + StringRef MCPU, MArch; + if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) +MCPU = A->getValue(); + if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) +MArch = A->getValue(); + + std::string CPU = Triple.isOSBinFormatMachO() +? tools::arm::getARMCPUForMArch(MArch, Triple).str() +: tools::arm::getARMTargetCPU(MCPU, MArch, Triple); + StringRef Suffix = tools::arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); + + bool IsBigEndian = Triple.getArch() == llvm::Triple::armeb || + Triple.getArch() == llvm::Triple::thumbeb; + // Handle pseudo-target flags '-mlittle-endian'/'-EL' and + // '-mbig-endian'/'-EB'. + if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian, + options::OPT_mbig_endian)) { +IsBigEndian = !A->getOption().matches(options::OPT_mlittle_endian); + } + std::string ArchName = IsBigEndian ? "armeb" : "arm"; + + // FIXME: Thumb should just be another -target-feaure, not in the triple. + bool IsMProfile = + llvm::ARM::parseArchProfile(Suffix) == llvm::ARM::ProfileKind::M; + bool ThumbDefault = IsMProfile || + // Thumb2 is the default for V7 on Darwin. + (llvm::ARM::parseArchVersion(Suffix) == 7 && + Triple.isOSBinFormatMachO()) || + // FIXME: this is invalid for WindowsCE + Triple.isOSWindows(); + + // Check if ARM ISA was explicitly selected (using -mno-thumb or -marm) for + // M-Class CPUs/architecture variants, which is not supported. + bool ARMModeRequested = + !Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault); + if (IsMProfile && ARMModeRequested) { +if (MCPU.size()) + D.Diag(diag::err_cpu_unsupported_isa) << CPU << "ARM"; +else + D.Diag(diag::err_arch_unsupported_isa) + << tools::arm::getARMArch(MArch, Triple) << "ARM"; + } + + // Check to see if an explicit choice to use thumb has been made via + // -mthumb. For assembler files we must check for -mthumb in the options + // passed to the assembler via -Wa or -Xassembler. + bool IsThumb = false; + if (InputType != types::TY_PP_Asm) +IsThumb = +Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault); + else { +// Ideally we would check for these flags in +// CollectArgsForIntegratedAssembler but we can't change the ArchName at +// that point. +llvm::StringRef WaMArch, WaMCPU; +for (const auto *A : + Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { + for (StringRef Value : A->getValues()) { +// There is no assembler equivalent of -mno-thumb, -marm, or -mno-arm. +if (Value == "-mthumb") + IsThumb = true; +else if (Value.startswith("-march=")) + WaMArch = Value.substr(7); +else if (Value.startswith("-mcpu=")) + WaMCPU = Value.substr(6); + } +} + +if (WaMCPU.size() || WaMArch.size()) { + // The way this works means that we prefer -Wa,-mcpu's architecture + // over -Wa,-march. Which matches the compiler behaviour. + Suffix = tools::arm::getLLVMArchSuffixForARM(WaMCPU, WaMArch, Triple); +} + } + + // Assembly files should start in ARM mode,
[PATCH] D98253: [clang][ARM] Refactor ComputeLLVMTriple code for ARM
ostannard accepted this revision. ostannard added a comment. This revision is now accepted and ready to land. LGTM Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98253/new/ https://reviews.llvm.org/D98253 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D98253: [clang][ARM] Refactor computeLLVMTriple code for ARM
DavidSpickett added a reviewer: ostannard. DavidSpickett added a comment. Besides the usual motivations this is prep for fixing https://bugs.llvm.org/show_bug.cgi?id=48894 for AArch64. Which will need a similar (but simpler) set of calls. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D98253/new/ https://reviews.llvm.org/D98253 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D98253: [clang][ARM] Refactor computeLLVMTriple code for ARM
DavidSpickett created this revision. Herald added subscribers: danielkiss, kristof.beyls. DavidSpickett requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. This moves code that sets the architecture name and Float ABI into two new functions in ToolChains/Arch/ARM.cpp. Greatly simplifying computeLLVMTriple. Some light refactoring in setArchNameInTriple to move local variables closer to their first use. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D98253 Files: clang/lib/Driver/ToolChain.cpp clang/lib/Driver/ToolChains/Arch/ARM.cpp clang/lib/Driver/ToolChains/Arch/ARM.h Index: clang/lib/Driver/ToolChains/Arch/ARM.h === --- clang/lib/Driver/ToolChains/Arch/ARM.h +++ clang/lib/Driver/ToolChains/Arch/ARM.h @@ -51,7 +51,11 @@ FloatABI getARMFloatABI(const ToolChain , const llvm::opt::ArgList ); FloatABI getARMFloatABI(const Driver , const llvm::Triple , const llvm::opt::ArgList ); +void setFloatABIInTriple(const Driver , const llvm::opt::ArgList , + llvm::Triple ); ReadTPMode getReadTPMode(const Driver , const llvm::opt::ArgList ); +void setArchNameInTriple(const Driver , const llvm::opt::ArgList , + types::ID InputType, llvm::Triple ); bool useAAPCSForMachO(const llvm::Triple ); void getARMArchCPUFromArgs(const llvm::opt::ArgList , Index: clang/lib/Driver/ToolChains/Arch/ARM.cpp === --- clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -166,6 +166,132 @@ return ReadTPMode::Soft; } +void arm::setArchNameInTriple(const Driver , const ArgList , + types::ID InputType, llvm::Triple ) { + StringRef MCPU, MArch; + if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) +MCPU = A->getValue(); + if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) +MArch = A->getValue(); + + std::string CPU = Triple.isOSBinFormatMachO() +? tools::arm::getARMCPUForMArch(MArch, Triple).str() +: tools::arm::getARMTargetCPU(MCPU, MArch, Triple); + StringRef Suffix = tools::arm::getLLVMArchSuffixForARM(CPU, MArch, Triple); + + bool IsBigEndian = Triple.getArch() == llvm::Triple::armeb || + Triple.getArch() == llvm::Triple::thumbeb; + // Handle pseudo-target flags '-mlittle-endian'/'-EL' and + // '-mbig-endian'/'-EB'. + if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian, + options::OPT_mbig_endian)) { +IsBigEndian = !A->getOption().matches(options::OPT_mlittle_endian); + } + std::string ArchName = IsBigEndian ? "armeb" : "arm"; + + // FIXME: Thumb should just be another -target-feaure, not in the triple. + bool IsMProfile = + llvm::ARM::parseArchProfile(Suffix) == llvm::ARM::ProfileKind::M; + bool ThumbDefault = IsMProfile || + // Thumb2 is the default for V7 on Darwin. + (llvm::ARM::parseArchVersion(Suffix) == 7 && + Triple.isOSBinFormatMachO()) || + // FIXME: this is invalid for WindowsCE + Triple.isOSWindows(); + + // Check if ARM ISA was explicitly selected (using -mno-thumb or -marm) for + // M-Class CPUs/architecture variants, which is not supported. + bool ARMModeRequested = + !Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault); + if (IsMProfile && ARMModeRequested) { +if (MCPU.size()) + D.Diag(diag::err_cpu_unsupported_isa) << CPU << "ARM"; +else + D.Diag(diag::err_arch_unsupported_isa) + << tools::arm::getARMArch(MArch, Triple) << "ARM"; + } + + // Check to see if an explicit choice to use thumb has been made via + // -mthumb. For assembler files we must check for -mthumb in the options + // passed to the assembler via -Wa or -Xassembler. + bool IsThumb = false; + if (InputType != types::TY_PP_Asm) +IsThumb = +Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, ThumbDefault); + else { +// Ideally we would check for these flags in +// CollectArgsForIntegratedAssembler but we can't change the ArchName at +// that point. +llvm::StringRef WaMArch, WaMCPU; +for (const auto *A : + Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { + for (StringRef Value : A->getValues()) { +// There is no assembler equivalent of -mno-thumb, -marm, or -mno-arm. +if (Value == "-mthumb") + IsThumb = true; +else if (Value.startswith("-march=")) + WaMArch = Value.substr(7); +else if (Value.startswith("-mcpu=")) + WaMCPU = Value.substr(6); + } +} + +if (WaMCPU.size() || WaMArch.size()) { + // The way this works means that we prefer -Wa,-mcpu's