[PATCH] D98253: [clang][ARM] Refactor ComputeLLVMTriple code for ARM

2021-03-11 Thread David Spickett via Phabricator via cfe-commits
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

2021-03-10 Thread Oliver Stannard (Linaro) via Phabricator via cfe-commits
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

2021-03-09 Thread David Spickett via Phabricator via cfe-commits
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

2021-03-09 Thread David Spickett via Phabricator via cfe-commits
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