r347194 - Test commit - delete trailing space.

2018-11-19 Thread Michael Platings via cfe-commits
Author: michaelplatings
Date: Mon Nov 19 04:16:05 2018
New Revision: 347194

URL: http://llvm.org/viewvc/llvm-project?rev=347194&view=rev
Log:
Test commit - delete trailing space.

Modified:
cfe/trunk/examples/clang-interpreter/Test.cxx

Modified: cfe/trunk/examples/clang-interpreter/Test.cxx
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/Test.cxx?rev=347194&r1=347193&r2=347194&view=diff
==
--- cfe/trunk/examples/clang-interpreter/Test.cxx (original)
+++ cfe/trunk/examples/clang-interpreter/Test.cxx Mon Nov 19 04:16:05 2018
@@ -21,7 +21,7 @@ static void ThrowerAnError(const char* N
 int main(int argc, const char** argv) {
   for (int I = 0; I < argc; ++I)
printf("arg[%d]='%s'\n", I, argv[I]);
-  
+
   try {
 ThrowerAnError("In JIT");
   } catch (const std::exception& E) {


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r355522 - [IR][ARM] Add function pointer alignment to datalayout

2019-03-06 Thread Michael Platings via cfe-commits
Author: michaelplatings
Date: Wed Mar  6 09:24:11 2019
New Revision: 355522

URL: http://llvm.org/viewvc/llvm-project?rev=355522&view=rev
Log:
[IR][ARM] Add function pointer alignment to datalayout

Use this feature to fix a bug on ARM where 4 byte alignment is
incorrectly assumed.

Differential Revision: https://reviews.llvm.org/D57335

Modified:
cfe/trunk/lib/Basic/Targets/ARM.cpp
cfe/trunk/test/CodeGen/armv7k-abi.c
cfe/trunk/test/CodeGen/target-data.c

Modified: cfe/trunk/lib/Basic/Targets/ARM.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/ARM.cpp?rev=355522&r1=355521&r2=355522&view=diff
==
--- cfe/trunk/lib/Basic/Targets/ARM.cpp (original)
+++ cfe/trunk/lib/Basic/Targets/ARM.cpp Wed Mar  6 09:24:11 2019
@@ -40,13 +40,14 @@ void ARMTargetInfo::setABIAAPCS() {
   // so set preferred for small types to 32.
   if (T.isOSBinFormatMachO()) {
 resetDataLayout(BigEndian
-? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-: "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+? "E-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
+: 
"e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
   } else if (T.isOSWindows()) {
 assert(!BigEndian && "Windows on ARM does not support big endian");
 resetDataLayout("e"
 "-m:w"
 "-p:32:32"
+"-Fi8"
 "-i64:64"
 "-v128:64:128"
 "-a:0:32"
@@ -54,11 +55,11 @@ void ARMTargetInfo::setABIAAPCS() {
 "-S64");
   } else if (T.isOSNaCl()) {
 assert(!BigEndian && "NaCl on ARM does not support big endian");
-resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
+resetDataLayout("e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S128");
   } else {
 resetDataLayout(BigEndian
-? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+? "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
+: 
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
   }
 
   // FIXME: Enumerated types are variable width in straight AAPCS.
@@ -87,17 +88,17 @@ void ARMTargetInfo::setABIAPCS(bool IsAA
 
   if (T.isOSBinFormatMachO() && IsAAPCS16) {
 assert(!BigEndian && "AAPCS16 does not support big-endian");
-resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
+resetDataLayout("e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128");
   } else if (T.isOSBinFormatMachO())
 resetDataLayout(
 BigEndian
-? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
-: "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
+? 
"E-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+: 
"e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
   else
 resetDataLayout(
 BigEndian
-? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
-: "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
+? 
"E-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+: 
"e-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
 
   // FIXME: Override "preferred align" for double and long long.
 }
@@ -1055,7 +1056,7 @@ CygwinARMTargetInfo::CygwinARMTargetInfo
   this->WCharType = TargetInfo::UnsignedShort;
   TLSSupported = false;
   DoubleAlign = LongLongAlign = 64;
-  resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+  resetDataLayout("e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
 }
 
 void CygwinARMTargetInfo::getTargetDefines(const LangOptions &Opts,

Modified: cfe/trunk/test/CodeGen/armv7k-abi.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/armv7k-abi.c?rev=355522&r1=355521&r2=355522&view=diff
==
--- cfe/trunk/test/CodeGen/armv7k-abi.c (original)
+++ cfe/trunk/test/CodeGen/armv7k-abi.c Wed Mar  6 09:24:11 2019
@@ -4,7 +4,7 @@
 
 // Make sure 64 and 128 bit types are naturally aligned by the v7k ABI:
 
-// CHECK: target datalayout = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128"
+// CHECK: target datalayout = "e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128"
 
 typedef struct {
   float arr[4];

Modified: cfe/trunk/test/CodeGen/target-data.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/target-data.c?rev=355522&r1=355521&r2=355522&view=diff
==
--- cfe/trunk/test/CodeGen/target-data.c (original)
+++ cfe/trunk/test/CodeGen/target-data.c Wed Mar  6 09:24:11 2019
@@ -96,7 +96,7 @@
 
 // RUN: %clang_cc1

r355585 - [IR][ARM] Add function pointer alignment to datalayout

2019-03-07 Thread Michael Platings via cfe-commits
Author: michaelplatings
Date: Thu Mar  7 01:15:23 2019
New Revision: 355585

URL: http://llvm.org/viewvc/llvm-project?rev=355585&view=rev
Log:
[IR][ARM] Add function pointer alignment to datalayout

Use this feature to fix a bug on ARM where 4 byte alignment is
incorrectly assumed.

Differential Revision: https://reviews.llvm.org/D57335

Modified:
cfe/trunk/lib/Basic/Targets/ARM.cpp
cfe/trunk/test/CodeGen/armv7k-abi.c
cfe/trunk/test/CodeGen/target-data.c

Modified: cfe/trunk/lib/Basic/Targets/ARM.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/ARM.cpp?rev=355585&r1=355584&r2=355585&view=diff
==
--- cfe/trunk/lib/Basic/Targets/ARM.cpp (original)
+++ cfe/trunk/lib/Basic/Targets/ARM.cpp Thu Mar  7 01:15:23 2019
@@ -40,13 +40,14 @@ void ARMTargetInfo::setABIAAPCS() {
   // so set preferred for small types to 32.
   if (T.isOSBinFormatMachO()) {
 resetDataLayout(BigEndian
-? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-: "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+? "E-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
+: 
"e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
   } else if (T.isOSWindows()) {
 assert(!BigEndian && "Windows on ARM does not support big endian");
 resetDataLayout("e"
 "-m:w"
 "-p:32:32"
+"-Fi8"
 "-i64:64"
 "-v128:64:128"
 "-a:0:32"
@@ -54,11 +55,11 @@ void ARMTargetInfo::setABIAAPCS() {
 "-S64");
   } else if (T.isOSNaCl()) {
 assert(!BigEndian && "NaCl on ARM does not support big endian");
-resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
+resetDataLayout("e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S128");
   } else {
 resetDataLayout(BigEndian
-? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+? "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
+: 
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
   }
 
   // FIXME: Enumerated types are variable width in straight AAPCS.
@@ -87,17 +88,17 @@ void ARMTargetInfo::setABIAPCS(bool IsAA
 
   if (T.isOSBinFormatMachO() && IsAAPCS16) {
 assert(!BigEndian && "AAPCS16 does not support big-endian");
-resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
+resetDataLayout("e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128");
   } else if (T.isOSBinFormatMachO())
 resetDataLayout(
 BigEndian
-? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
-: "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
+? 
"E-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+: 
"e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
   else
 resetDataLayout(
 BigEndian
-? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
-: "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
+? 
"E-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+: 
"e-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
 
   // FIXME: Override "preferred align" for double and long long.
 }
@@ -1055,7 +1056,7 @@ CygwinARMTargetInfo::CygwinARMTargetInfo
   this->WCharType = TargetInfo::UnsignedShort;
   TLSSupported = false;
   DoubleAlign = LongLongAlign = 64;
-  resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+  resetDataLayout("e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
 }
 
 void CygwinARMTargetInfo::getTargetDefines(const LangOptions &Opts,

Modified: cfe/trunk/test/CodeGen/armv7k-abi.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/armv7k-abi.c?rev=355585&r1=355584&r2=355585&view=diff
==
--- cfe/trunk/test/CodeGen/armv7k-abi.c (original)
+++ cfe/trunk/test/CodeGen/armv7k-abi.c Thu Mar  7 01:15:23 2019
@@ -4,7 +4,7 @@
 
 // Make sure 64 and 128 bit types are naturally aligned by the v7k ABI:
 
-// CHECK: target datalayout = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128"
+// CHECK: target datalayout = "e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128"
 
 typedef struct {
   float arr[4];

Modified: cfe/trunk/test/CodeGen/target-data.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/target-data.c?rev=355585&r1=355584&r2=355585&view=diff
==
--- cfe/trunk/test/CodeGen/target-data.c (original)
+++ cfe/trunk/test/CodeGen/target-data.c Thu Mar  7 01:15:23 2019
@@ -96,7 +96,7 @@
 
 // RUN: %clang_cc1

r355685 - [IR][ARM] Add function pointer alignment to datalayout

2019-03-08 Thread Michael Platings via cfe-commits
Author: michaelplatings
Date: Fri Mar  8 02:44:06 2019
New Revision: 355685

URL: http://llvm.org/viewvc/llvm-project?rev=355685&view=rev
Log:
[IR][ARM] Add function pointer alignment to datalayout

Use this feature to fix a bug on ARM where 4 byte alignment is
incorrectly assumed.

Differential Revision: https://reviews.llvm.org/D57335

Modified:
cfe/trunk/lib/Basic/Targets/ARM.cpp
cfe/trunk/test/CodeGen/armv7k-abi.c
cfe/trunk/test/CodeGen/target-data.c

Modified: cfe/trunk/lib/Basic/Targets/ARM.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/ARM.cpp?rev=355685&r1=355684&r2=355685&view=diff
==
--- cfe/trunk/lib/Basic/Targets/ARM.cpp (original)
+++ cfe/trunk/lib/Basic/Targets/ARM.cpp Fri Mar  8 02:44:06 2019
@@ -40,13 +40,14 @@ void ARMTargetInfo::setABIAAPCS() {
   // so set preferred for small types to 32.
   if (T.isOSBinFormatMachO()) {
 resetDataLayout(BigEndian
-? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-: "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+? "E-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
+: 
"e-m:o-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
   } else if (T.isOSWindows()) {
 assert(!BigEndian && "Windows on ARM does not support big endian");
 resetDataLayout("e"
 "-m:w"
 "-p:32:32"
+"-Fi8"
 "-i64:64"
 "-v128:64:128"
 "-a:0:32"
@@ -54,11 +55,11 @@ void ARMTargetInfo::setABIAAPCS() {
 "-S64");
   } else if (T.isOSNaCl()) {
 assert(!BigEndian && "NaCl on ARM does not support big endian");
-resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
+resetDataLayout("e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S128");
   } else {
 resetDataLayout(BigEndian
-? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+? "E-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
+: 
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
   }
 
   // FIXME: Enumerated types are variable width in straight AAPCS.
@@ -87,17 +88,17 @@ void ARMTargetInfo::setABIAPCS(bool IsAA
 
   if (T.isOSBinFormatMachO() && IsAAPCS16) {
 assert(!BigEndian && "AAPCS16 does not support big-endian");
-resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
+resetDataLayout("e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128");
   } else if (T.isOSBinFormatMachO())
 resetDataLayout(
 BigEndian
-? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
-: "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
+? 
"E-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+: 
"e-m:o-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
   else
 resetDataLayout(
 BigEndian
-? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
-: "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
+? 
"E-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
+: 
"e-m:e-p:32:32-Fi8-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32");
 
   // FIXME: Override "preferred align" for double and long long.
 }
@@ -1055,7 +1056,7 @@ CygwinARMTargetInfo::CygwinARMTargetInfo
   this->WCharType = TargetInfo::UnsignedShort;
   TLSSupported = false;
   DoubleAlign = LongLongAlign = 64;
-  resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
+  resetDataLayout("e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
 }
 
 void CygwinARMTargetInfo::getTargetDefines(const LangOptions &Opts,

Modified: cfe/trunk/test/CodeGen/armv7k-abi.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/armv7k-abi.c?rev=355685&r1=355684&r2=355685&view=diff
==
--- cfe/trunk/test/CodeGen/armv7k-abi.c (original)
+++ cfe/trunk/test/CodeGen/armv7k-abi.c Fri Mar  8 02:44:06 2019
@@ -4,7 +4,7 @@
 
 // Make sure 64 and 128 bit types are naturally aligned by the v7k ABI:
 
-// CHECK: target datalayout = "e-m:o-p:32:32-i64:64-a:0:32-n32-S128"
+// CHECK: target datalayout = "e-m:o-p:32:32-Fi8-i64:64-a:0:32-n32-S128"
 
 typedef struct {
   float arr[4];

Modified: cfe/trunk/test/CodeGen/target-data.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/target-data.c?rev=355685&r1=355684&r2=355685&view=diff
==
--- cfe/trunk/test/CodeGen/target-data.c (original)
+++ cfe/trunk/test/CodeGen/target-data.c Fri Mar  8 02:44:06 2019
@@ -96,7 +96,7 @@
 
 // RUN: %clang_cc1

[clang] Multilib support for libraries with exceptions (PR #75031)

2023-12-12 Thread Michael Platings via cfe-commits


@@ -179,6 +179,12 @@ static void findMultilibsFromYAML(const ToolChain &TC, 
const Driver &D,
   if (!MB)
 return;
   Multilib::flags_list Flags = TC.getMultilibFlags(Args);
+  if (TC.getRTTIMode() == ToolChain::RTTIMode::RM_Disabled) {
+Flags.push_back("-fno-rtti");
+  }
+  if (TC.getExceptionsMode() == ToolChain::ExceptionsMode::EM_Disabled) {
+Flags.push_back("-fno-exceptions");
+  }

mplatings wrote:

This belongs in `getMultilibFlags()`

https://github.com/llvm/llvm-project/pull/75031
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Multilib support for libraries with exceptions (PR #75031)

2024-01-02 Thread Michael Platings via cfe-commits

https://github.com/mplatings edited 
https://github.com/llvm/llvm-project/pull/75031
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Multilib support for libraries with exceptions (PR #75031)

2024-01-02 Thread Michael Platings via cfe-commits

https://github.com/mplatings commented:

I'd be disinclined to add `CachedExceptionsMode`:
* It's more code to maintain.
* Most toolchains will never use it so for them it's a small extra runtime cost 
with no benefit.

I think you could calculate the exceptions mode in `getMultilibFlags` when 
needed.

I'm not actively working on LLVM any more so I'm going to remove myself as 
reviewer now.

https://github.com/llvm/llvm-project/pull/75031
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Multilib support for libraries with exceptions (PR #75031)

2024-01-02 Thread Michael Platings via cfe-commits


@@ -77,10 +77,21 @@ static ToolChain::RTTIMode CalculateRTTIMode(const ArgList 
&Args,
   return NoRTTI ? ToolChain::RM_Disabled : ToolChain::RM_Enabled;
 }
 
+static ToolChain::ExceptionsMode CalculateExceptionsMode(const ArgList &Args) {
+
+  Arg *exceptionsArg = Args.getLastArg(options::OPT_fno_exceptions);
+  if (exceptionsArg &&
+  exceptionsArg->getOption().matches(options::OPT_fno_exceptions)) {
+return ToolChain::EM_Disabled;
+  }
+  return ToolChain::EM_Enabled;

mplatings wrote:

This is incorrect. There are plenty of examples across the clang code of how to 
check whether exceptions should be enabled or not.

https://github.com/llvm/llvm-project/pull/75031
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] Multilib support for libraries with exceptions (PR #75031)

2024-01-02 Thread Michael Platings via cfe-commits

mplatings wrote:

> I'm not actively working on LLVM any more so I'm going to remove myself as 
> reviewer now.

Or at least I would if GitHub would let me! 
https://github.com/orgs/community/discussions/23054

https://github.com/llvm/llvm-project/pull/75031
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 0c7ca82 - Fix external-names.c test when separator is \\

2019-12-31 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2019-12-31T11:15:46Z
New Revision: 0c7ca82161b519856bb1d54e181b578dc067cd3e

URL: 
https://github.com/llvm/llvm-project/commit/0c7ca82161b519856bb1d54e181b578dc067cd3e
DIFF: 
https://github.com/llvm/llvm-project/commit/0c7ca82161b519856bb1d54e181b578dc067cd3e.diff

LOG: Fix external-names.c test when separator is \\

This fixes the following failure:

C:\[...]\llvm\tools\clang\test\VFS\external-names.c:34:26: error: 
CHECK-DEBUG-EXTERNAL: expected string not found in input
// CHECK-DEBUG-EXTERNAL: ![[Num]] = !DIFile(filename: 
"{{[^"]*}}Inputs{{.}}external-names.h"
 ^
[...]
:42:54: note: possible intended match here
!10 = !DIFile(filename: 
"C:/[...]\\llvm\\tools\\clang\\test\\VFS\\Inputs\\external-names.h", directory: 
"")

Differential Revision: https://reviews.llvm.org/D71991

Added: 


Modified: 
clang/test/VFS/external-names.c

Removed: 




diff  --git a/clang/test/VFS/external-names.c b/clang/test/VFS/external-names.c
index 0500611c3e40..7e24b5fdf063 100644
--- a/clang/test/VFS/external-names.c
+++ b/clang/test/VFS/external-names.c
@@ -21,7 +21,7 @@
 // Diagnostics:
 
 // RUN: %clang_cc1 -I %t -ivfsoverlay %t.external.yaml -fsyntax-only %s 2>&1 | 
FileCheck -check-prefix=CHECK-DIAG-EXTERNAL %s
-// CHECK-DIAG-EXTERNAL: {{.*}}Inputs{{.}}external-names.h:{{[0-9]*:[0-9]*}}: 
warning: incompatible pointer
+// CHECK-DIAG-EXTERNAL: {{.*}}Inputs{{..?}}external-names.h:{{[0-9]*:[0-9]*}}: 
warning: incompatible pointer
 
 // RUN: %clang_cc1 -I %t -ivfsoverlay %t.yaml -fsyntax-only %s 2>&1 | 
FileCheck -check-prefix=CHECK-DIAG %s
 // CHECK-DIAG-NOT: Inputs
@@ -31,7 +31,7 @@
 
 // RUN: %clang_cc1 -I %t -ivfsoverlay %t.external.yaml -triple 
%itanium_abi_triple -debug-info-kind=limited -emit-llvm %s -o - | FileCheck 
-check-prefix=CHECK-DEBUG-EXTERNAL %s
 // CHECK-DEBUG-EXTERNAL: !DISubprogram({{.*}}file: ![[Num:[0-9]+]]
-// CHECK-DEBUG-EXTERNAL: ![[Num]] = !DIFile(filename: 
"{{[^"]*}}Inputs{{.}}external-names.h"
+// CHECK-DEBUG-EXTERNAL: ![[Num]] = !DIFile(filename: 
"{{[^"]*}}Inputs{{..?}}external-names.h"
 
 // RUN: %clang_cc1 -I %t -ivfsoverlay %t.yaml -triple %itanium_abi_triple 
-debug-info-kind=limited -emit-llvm %s -o - | FileCheck 
-check-prefix=CHECK-DEBUG %s
 // CHECK-DEBUG-NOT: Inputs
@@ -42,7 +42,7 @@
 // RUN: %clang_cc1 -D REINCLUDE -I %t -ivfsoverlay %t.external.yaml -Eonly %s 
-MTfoo -dependency-file %t.external.dep
 // RUN: echo "EOF" >> %t.external.dep
 // RUN: cat %t.external.dep | FileCheck --check-prefix=CHECK-DEP-EXTERNAL %s
-// CHECK-DEP-EXTERNAL: Inputs{{.}}external-names.h
+// CHECK-DEP-EXTERNAL: Inputs{{..?}}external-names.h
 // CHECK-DEP-EXTERNAL-NEXT: EOF
 
 // RUN: %clang_cc1 -D REINCLUDE -I %t -ivfsoverlay %t.yaml -Eonly %s -MTfoo 
-dependency-file %t.dep



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] dba8fce - Fix frint ACLE intrinsic names

2022-09-29 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2022-09-29T09:13:07+01:00
New Revision: dba8fced969e2eca9e8650a874293927db17d131

URL: 
https://github.com/llvm/llvm-project/commit/dba8fced969e2eca9e8650a874293927db17d131
DIFF: 
https://github.com/llvm/llvm-project/commit/dba8fced969e2eca9e8650a874293927db17d131.diff

LOG: Fix frint ACLE intrinsic names

Although the instruction names begin "frint", the ACLE spec states that
the intrinsic names begin "__rint", without the "f".

Differential Revision: https://reviews.llvm.org/D134824

Added: 


Modified: 
clang/include/clang/Basic/BuiltinsAArch64.def
clang/lib/CodeGen/CGBuiltin.cpp
clang/lib/Headers/arm_acle.h
clang/test/CodeGen/aarch64-v8.5a-scalar-frint3264-intrinsic.c

Removed: 




diff  --git a/clang/include/clang/Basic/BuiltinsAArch64.def 
b/clang/include/clang/Basic/BuiltinsAArch64.def
index 3c0a5f12681d0..036df7435bfba 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -107,14 +107,14 @@ BUILTIN(__builtin_arm_tcancel, "vWUIi", "n")
 BUILTIN(__builtin_arm_ttest, "WUi", "nc")
 
 // Armv8.5-A FP rounding intrinsics
-BUILTIN(__builtin_arm_frint32zf, "ff", "")
-BUILTIN(__builtin_arm_frint32z, "dd", "")
-BUILTIN(__builtin_arm_frint64zf, "ff", "")
-BUILTIN(__builtin_arm_frint64z, "dd", "")
-BUILTIN(__builtin_arm_frint32xf, "ff", "")
-BUILTIN(__builtin_arm_frint32x, "dd", "")
-BUILTIN(__builtin_arm_frint64xf, "ff", "")
-BUILTIN(__builtin_arm_frint64x, "dd", "")
+BUILTIN(__builtin_arm_rint32zf, "ff", "")
+BUILTIN(__builtin_arm_rint32z, "dd", "")
+BUILTIN(__builtin_arm_rint64zf, "ff", "")
+BUILTIN(__builtin_arm_rint64z, "dd", "")
+BUILTIN(__builtin_arm_rint32xf, "ff", "")
+BUILTIN(__builtin_arm_rint32x, "dd", "")
+BUILTIN(__builtin_arm_rint64xf, "ff", "")
+BUILTIN(__builtin_arm_rint64x, "dd", "")
 
 // Armv8.5-A Random number generation intrinsics
 BUILTIN(__builtin_arm_rndr,   "iWUi*", "n")

diff  --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 2d8b0175e2ffa..786ed8c5935f9 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -9538,32 +9538,32 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned 
BuiltinID,
   "cls");
   }
 
-  if (BuiltinID == clang::AArch64::BI__builtin_arm_frint32zf ||
-  BuiltinID == clang::AArch64::BI__builtin_arm_frint32z) {
+  if (BuiltinID == clang::AArch64::BI__builtin_arm_rint32zf ||
+  BuiltinID == clang::AArch64::BI__builtin_arm_rint32z) {
 llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
 llvm::Type *Ty = Arg->getType();
 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::aarch64_frint32z, 
Ty),
   Arg, "frint32z");
   }
 
-  if (BuiltinID == clang::AArch64::BI__builtin_arm_frint64zf ||
-  BuiltinID == clang::AArch64::BI__builtin_arm_frint64z) {
+  if (BuiltinID == clang::AArch64::BI__builtin_arm_rint64zf ||
+  BuiltinID == clang::AArch64::BI__builtin_arm_rint64z) {
 llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
 llvm::Type *Ty = Arg->getType();
 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::aarch64_frint64z, 
Ty),
   Arg, "frint64z");
   }
 
-  if (BuiltinID == clang::AArch64::BI__builtin_arm_frint32xf ||
-  BuiltinID == clang::AArch64::BI__builtin_arm_frint32x) {
+  if (BuiltinID == clang::AArch64::BI__builtin_arm_rint32xf ||
+  BuiltinID == clang::AArch64::BI__builtin_arm_rint32x) {
 llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
 llvm::Type *Ty = Arg->getType();
 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::aarch64_frint32x, 
Ty),
   Arg, "frint32x");
   }
 
-  if (BuiltinID == clang::AArch64::BI__builtin_arm_frint64xf ||
-  BuiltinID == clang::AArch64::BI__builtin_arm_frint64x) {
+  if (BuiltinID == clang::AArch64::BI__builtin_arm_rint64xf ||
+  BuiltinID == clang::AArch64::BI__builtin_arm_rint64x) {
 llvm::Value *Arg = EmitScalarExpr(E->getArg(0));
 llvm::Type *Ty = Arg->getType();
 return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::aarch64_frint64x, 
Ty),

diff  --git a/clang/lib/Headers/arm_acle.h b/clang/lib/Headers/arm_acle.h
index fc347f760d828..ed3fc1de1fd40 100644
--- a/clang/lib/Headers/arm_acle.h
+++ b/clang/lib/Headers/arm_acle.h
@@ -642,43 +642,43 @@ __jcvt(double __a) {
 /* Armv8.5-A FP rounding intrinsics */
 #if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE && 
defined(__ARM_FEATURE_FRINT)
 static __inline__ float __attribute__((__always_inline__, __nodebug__))
-__frint32zf(float __a) {
-  return __builtin_arm_frint32zf(__a);
+__rint32zf(float __a) {
+  return __builtin_arm_rint32zf(__a);
 }
 
 static __inline__ double __attribute__((__always_inline__, __nodebug__))
-__frint32z(double __a) {
-  return __builtin_arm_frint32z(__a);
+__rint32z(double __a) {
+  return __builtin_a

[clang] fa39c0a - Revert "[NFC] Add checks for self-assignment."

2023-07-24 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-07-24T09:36:11+01:00
New Revision: fa39c0a58e87d9fb0751d4e65a77259a3ec53448

URL: 
https://github.com/llvm/llvm-project/commit/fa39c0a58e87d9fb0751d4e65a77259a3ec53448
DIFF: 
https://github.com/llvm/llvm-project/commit/fa39c0a58e87d9fb0751d4e65a77259a3ec53448.diff

LOG: Revert "[NFC] Add checks for self-assignment."

This reverts commit 8ac137acefc01caf636db5f95eb0977c97def1ba.

The code does not compile.

Added: 


Modified: 
clang/lib/AST/APValue.cpp
clang/lib/CodeGen/CGDebugInfo.h
clang/lib/Interpreter/Value.cpp

Removed: 




diff  --git a/clang/lib/AST/APValue.cpp b/clang/lib/AST/APValue.cpp
index 7bbde6d065316e..5b0a5e256e411a 100644
--- a/clang/lib/AST/APValue.cpp
+++ b/clang/lib/AST/APValue.cpp
@@ -390,13 +390,11 @@ APValue &APValue::operator=(const APValue &RHS) {
 }
 
 APValue &APValue::operator=(APValue &&RHS) {
-  if (this != RHS) {
-if (Kind != None && Kind != Indeterminate)
-  DestroyDataAndMakeUninit();
-Kind = RHS.Kind;
-Data = RHS.Data;
-RHS.Kind = None;
-  }
+  if (Kind != None && Kind != Indeterminate)
+DestroyDataAndMakeUninit();
+  Kind = RHS.Kind;
+  Data = RHS.Data;
+  RHS.Kind = None;
   return *this;
 }
 

diff  --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 5b089f3330c42b..58ee6dd64c4fc3 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -832,10 +832,8 @@ class ApplyDebugLocation {
 
   // Define copy assignment operator.
   ApplyDebugLocation &operator=(ApplyDebugLocation &&Other) {
-if (this != Other) {
-  CGF = Other.CGF;
-  Other.CGF = nullptr;
-}
+CGF = Other.CGF;
+Other.CGF = nullptr;
 return *this;
   }
 

diff  --git a/clang/lib/Interpreter/Value.cpp b/clang/lib/Interpreter/Value.cpp
index 68adfc268261af..6d0eaf1b82e108 100644
--- a/clang/lib/Interpreter/Value.cpp
+++ b/clang/lib/Interpreter/Value.cpp
@@ -201,17 +201,16 @@ Value &Value::operator=(const Value &RHS) {
 }
 
 Value &Value::operator=(Value &&RHS) noexcept {
-  if (this != RHS) {
-if (IsManuallyAlloc)
-  ValueStorage::getFromPayload(getPtr())->Release();
+  if (IsManuallyAlloc)
+ValueStorage::getFromPayload(getPtr())->Release();
 
-Interp = std::exchange(RHS.Interp, nullptr);
-OpaqueType = std::exchange(RHS.OpaqueType, nullptr);
-ValueKind = std::exchange(RHS.ValueKind, K_Unspecified);
-IsManuallyAlloc = std::exchange(RHS.IsManuallyAlloc, false);
+  Interp = std::exchange(RHS.Interp, nullptr);
+  OpaqueType = std::exchange(RHS.OpaqueType, nullptr);
+  ValueKind = std::exchange(RHS.ValueKind, K_Unspecified);
+  IsManuallyAlloc = std::exchange(RHS.IsManuallyAlloc, false);
+
+  Data = RHS.Data;
 
-Data = RHS.Data;
-  }
   return *this;
 }
 



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] ab5ebe4 - [NFC][Clang][Test] Fix warning-as-error

2023-08-03 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-08-03T08:26:25+01:00
New Revision: ab5ebe4b2088ba3a22a7922cd8bd827a7cedc3a4

URL: 
https://github.com/llvm/llvm-project/commit/ab5ebe4b2088ba3a22a7922cd8bd827a7cedc3a4
DIFF: 
https://github.com/llvm/llvm-project/commit/ab5ebe4b2088ba3a22a7922cd8bd827a7cedc3a4.diff

LOG: [NFC][Clang][Test] Fix warning-as-error

Since D156363 this test has been failing with -Wmissing-multilib if
multilib is configured for the BareMetal toolchain.
By setting sysroot the test is more hermetic and the failure is avoided.

Added: 


Modified: 
clang/test/Driver/fsemantic-interposition.c

Removed: 




diff  --git a/clang/test/Driver/fsemantic-interposition.c 
b/clang/test/Driver/fsemantic-interposition.c
index e2713de80f690a..0ee0dbb3be3471 100644
--- a/clang/test/Driver/fsemantic-interposition.c
+++ b/clang/test/Driver/fsemantic-interposition.c
@@ -1,20 +1,20 @@
-// RUN: %clang -target x86_64 %s -Werror -fpic -fsemantic-interposition -c 
-### 2>&1 | FileCheck %s
-// RUN: %clang -target x86_64 %s -Werror -fPIC -fsemantic-interposition -c 
-### 2>&1 | FileCheck %s
+// RUN: %clang --sysroot=%S/Inputs -target x86_64 %s -Werror -fpic 
-fsemantic-interposition -c -### 2>&1 | FileCheck %s
+// RUN: %clang --sysroot=%S/Inputs -target x86_64 %s -Werror -fPIC 
-fsemantic-interposition -c -### 2>&1 | FileCheck %s
 // CHECK: "-fsemantic-interposition"
 
 /// No-op for -fno-pic/-fpie.
-// RUN: %clang -target x86_64 %s -Werror -fsemantic-interposition -c -### 2>&1 
| FileCheck --check-prefix=NOOP %s
-// RUN: %clang -target x86_64 %s -Werror -fPIE -fsemantic-interposition -c 
-### 2>&1 | FileCheck --check-prefix=NOOP %s
+// RUN: %clang --sysroot=%S/Inputs -target x86_64 %s -Werror 
-fsemantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NOOP %s
+// RUN: %clang --sysroot=%S/Inputs -target x86_64 %s -Werror -fPIE 
-fsemantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NOOP %s
 // NOOP-NOT: "-fsemantic-interposition"
 // NOOP-NOT: "-fno-semantic-interposition"
 
 /// If -fno-semantic-interposition is specified and the target supports local
 /// aliases, neither CC1 option is set.
-// RUN: %clang -target aarch64 %s -Werror -fPIC -fno-semantic-interposition -c 
-### 2>&1 | FileCheck --check-prefix=NO %s
-// RUN: %clang -target riscv32 %s -Werror -fPIC -fno-semantic-interposition -c 
-### 2>&1 | FileCheck --check-prefix=NO %s
-// RUN: %clang -target riscv64 %s -Werror -fPIC -fno-semantic-interposition -c 
-### 2>&1 | FileCheck --check-prefix=NO %s
-// RUN: %clang -target i386 %s -Werror -fPIC -fno-semantic-interposition -c 
-### 2>&1 | FileCheck --check-prefix=NO %s
-// RUN: %clang -target x86_64 %s -Werror -fPIC -fno-semantic-interposition -c 
-### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang --sysroot=%S/Inputs -target aarch64 %s -Werror -fPIC 
-fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang --sysroot=%S/Inputs -target riscv32 %s -Werror -fPIC 
-fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang --sysroot=%S/Inputs -target riscv64 %s -Werror -fPIC 
-fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang --sysroot=%S/Inputs -target i386 %s -Werror -fPIC 
-fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
+// RUN: %clang --sysroot=%S/Inputs -target x86_64 %s -Werror -fPIC 
-fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=NO %s
 // NO-NOT: "-fsemantic-interposition"
 // NO-NOT: "-fhalf-no-semantic-interposition"
 
@@ -23,8 +23,8 @@
 /// local aliases, use the traditional half-baked behavor: interprocedural
 /// optimizations are allowed but local aliases are not used. If references are
 /// not optimized out, semantic interposition at runtime is possible.
-// RUN: %clang -target ppc64le %s -Werror -fPIC -fno-semantic-interposition -c 
-### 2>&1 | FileCheck --check-prefix=HALF %s
+// RUN: %clang --sysroot=%S/Inputs -target ppc64le %s -Werror -fPIC 
-fno-semantic-interposition -c -### 2>&1 | FileCheck --check-prefix=HALF %s
 
-// RUN: %clang -target x86_64 %s -Werror -fPIC -c -### 2>&1 | FileCheck 
--check-prefix=HALF %s
+// RUN: %clang --sysroot=%S/Inputs -target x86_64 %s -Werror -fPIC -c -### 
2>&1 | FileCheck --check-prefix=HALF %s
 //
 // HALF: "-fhalf-no-semantic-interposition"



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 872d22c - [NFC][Clang][Test] Fix warning-as-error

2023-08-09 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-08-09T21:29:53+01:00
New Revision: 872d22c735b83d39cbd7660e4678a9c0d42fe36a

URL: 
https://github.com/llvm/llvm-project/commit/872d22c735b83d39cbd7660e4678a9c0d42fe36a
DIFF: 
https://github.com/llvm/llvm-project/commit/872d22c735b83d39cbd7660e4678a9c0d42fe36a.diff

LOG: [NFC][Clang][Test] Fix warning-as-error

Since D149444 this test has been failing with -Wmissing-multilib if
multilib is configured for the BareMetal toolchain.
By setting sysroot the test is more hermetic and the failure is avoided.

Added: 


Modified: 
clang/test/Driver/arm-execute-only.c

Removed: 




diff  --git a/clang/test/Driver/arm-execute-only.c 
b/clang/test/Driver/arm-execute-only.c
index 3c3af5fd690db4..1b2fad7299484a 100644
--- a/clang/test/Driver/arm-execute-only.c
+++ b/clang/test/Driver/arm-execute-only.c
@@ -1,4 +1,4 @@
-// RUN: %clang -c -fdriver-only -Werror --target=arm-arm-none-eabi \
+// RUN: %clang --sysroot=%S/Inputs -c -fdriver-only -Werror 
--target=arm-arm-none-eabi \
 // RUN:   -march=armv6-m -mexecute-only %s 2>&1 | count 0
 
 // RUN: not %clang -### -c --target=arm-arm-none-eabi -march=armv6 
-mexecute-only %s 2>&1 |\



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 7916573 - [ARM][Driver] Change float-abi warning

2023-07-07 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-07-07T09:41:18+01:00
New Revision: 79165735e11e40e1fbbb91ccbdd4df24d6349837

URL: 
https://github.com/llvm/llvm-project/commit/79165735e11e40e1fbbb91ccbdd4df24d6349837
DIFF: 
https://github.com/llvm/llvm-project/commit/79165735e11e40e1fbbb91ccbdd4df24d6349837.diff

LOG: [ARM][Driver] Change float-abi warning

Previously the warning stated "flag ignored" which is only partially
true - the invalid flag would prevent -feature +soft-float-abi from
being emitted which resulted in user-visible behaviour like
__ARM_PCS_VFP being defined.

Rather than attempt to coerce invalid flags into valid behaviour, don't
describe the expected behaviour.

Ideally the warning would be an error, as it is in GCC. However there
are tests in llvm-project that trigger the warning. Therefore one has to
assume that making the warning an error would break other code that
already exists in the wild.

Also apply test improvements suggested by @MaskRay on D150902.

Reviewed By: simon_tatham

Differential Revision: https://reviews.llvm.org/D154578

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/include/clang/Basic/DiagnosticGroups.td
clang/test/Driver/arm-no-float-regs.c

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index d8112641eaf58f..095fbfe8ba2b1d 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -416,10 +416,10 @@ def warn_drv_assuming_mfloat_abi_is : Warning<
   "unknown platform, assuming -mfloat-abi=%0">;
 def warn_drv_unsupported_float_abi_by_lib : Warning<
   "float ABI '%0' is not supported by current library">,
-  InGroup>;
+  InGroup;
 def warn_drv_no_floating_point_registers: Warning<
-  "'%0': selected processor lacks floating point registers; flag ignored">,
-  InGroup;
+  "'%0': selected processor lacks floating point registers">,
+  InGroup;
 def warn_ignoring_ftabstop_value : Warning<
   "ignoring invalid -ftabstop value '%0', using default value %1">;
 def warn_drv_overriding_flag_option : Warning<

diff  --git a/clang/include/clang/Basic/DiagnosticGroups.td 
b/clang/include/clang/Basic/DiagnosticGroups.td
index 7f5fb2c1b1495d..8b15337fda8829 100644
--- a/clang/include/clang/Basic/DiagnosticGroups.td
+++ b/clang/include/clang/Basic/DiagnosticGroups.td
@@ -1349,6 +1349,8 @@ def OptionIgnored : DiagGroup<"option-ignored">;
 
 def UnknownArgument : DiagGroup<"unknown-argument">;
 
+def UnsupportedABI : DiagGroup<"unsupported-abi">;
+
 // A warning group for warnings about code that clang accepts when
 // compiling OpenCL C/C++ but which is not compatible with the SPIR(-V) spec.
 def SpirCompat : DiagGroup<"spir-compat">;

diff  --git a/clang/test/Driver/arm-no-float-regs.c 
b/clang/test/Driver/arm-no-float-regs.c
index b542f7d2805fe0..b46d8fc292c916 100644
--- a/clang/test/Driver/arm-no-float-regs.c
+++ b/clang/test/Driver/arm-no-float-regs.c
@@ -1,7 +1,6 @@
-// REQUIRES: arm-registered-target
-
 // Check that -mfloat-abi=hard gives a warning if FP registers aren't 
available.
-// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m0 -mfloat-abi=hard -### -c 
%s 2>&1
+// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m0 -mfloat-abi=hard -### -c 
%s 2>&1 \
+// RUN:   | FileCheck %s
 
 // RUN: %clang --target=arm-none-eabi -mcpu=cortex-m0 -mhard-float -### -c %s 
2>&1 \
 // RUN:   | FileCheck -check-prefix=HARDFLOAT %s
@@ -20,4 +19,4 @@
 
 // CHECK: warning: '-mfloat-abi=hard': selected processor lacks floating point 
registers
 // HARDFLOAT: warning: '-mhard-float': selected processor lacks floating point 
registers
-// NOWARN-NOT: selected processor lacks floating point registers
+// NOWARN-NOT: warning:



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 36a1e99 - [ARM][Driver] Partial revert of D154578

2023-07-10 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-07-10T10:10:38+01:00
New Revision: 36a1e998030d47097c4651e0b88595363a057952

URL: 
https://github.com/llvm/llvm-project/commit/36a1e998030d47097c4651e0b88595363a057952
DIFF: 
https://github.com/llvm/llvm-project/commit/36a1e998030d47097c4651e0b88595363a057952.diff

LOG: [ARM][Driver] Partial revert of D154578

Checking that "warning:" isn't emitted is too broad.
Downstream code may emit unrelated warnings which causes the test to
fail.

Added: 


Modified: 
clang/test/Driver/arm-no-float-regs.c

Removed: 




diff  --git a/clang/test/Driver/arm-no-float-regs.c 
b/clang/test/Driver/arm-no-float-regs.c
index b46d8fc292c916..3087b7598f248f 100644
--- a/clang/test/Driver/arm-no-float-regs.c
+++ b/clang/test/Driver/arm-no-float-regs.c
@@ -19,4 +19,4 @@
 
 // CHECK: warning: '-mfloat-abi=hard': selected processor lacks floating point 
registers
 // HARDFLOAT: warning: '-mhard-float': selected processor lacks floating point 
registers
-// NOWARN-NOT: warning:
+// NOWARN-NOT: selected processor lacks floating point registers



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 60bbf27 - [ARM][NFC] Use FPUKind enum instead of unsigned

2023-03-16 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-03-16T13:38:10Z
New Revision: 60bbf271b568ab85ef90c92ff6014e06786217b9

URL: 
https://github.com/llvm/llvm-project/commit/60bbf271b568ab85ef90c92ff6014e06786217b9
DIFF: 
https://github.com/llvm/llvm-project/commit/60bbf271b568ab85ef90c92ff6014e06786217b9.diff

LOG: [ARM][NFC] Use FPUKind enum instead of unsigned

Also rename some FPUID variables to FPUKind now it's clear that's what
they are.

Differential Revision: https://reviews.llvm.org/D146141

Added: 


Modified: 
clang/lib/Basic/Targets/ARM.cpp
clang/lib/Driver/ToolChains/Arch/ARM.cpp
llvm/include/llvm/MC/MCStreamer.h
llvm/include/llvm/TargetParser/ARMTargetParser.h
llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
llvm/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp
llvm/lib/TargetParser/ARMTargetParser.cpp
llvm/unittests/TargetParser/TargetParserTest.cpp

Removed: 




diff  --git a/clang/lib/Basic/Targets/ARM.cpp b/clang/lib/Basic/Targets/ARM.cpp
index b85d5dc2d3478..e01379ec82fb4 100644
--- a/clang/lib/Basic/Targets/ARM.cpp
+++ b/clang/lib/Basic/Targets/ARM.cpp
@@ -452,7 +452,7 @@ bool ARMTargetInfo::initFeatureMap(
   }
 
   // get default FPU features
-  unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
+  llvm::ARM::FPUKind FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
   llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
 
   // get default Extension features

diff  --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp 
b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
index e75f8a474410c..7843031a4c22f 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -72,25 +72,25 @@ static void getARMHWDivFeatures(const Driver &D, const Arg 
*A,
 }
 
 // Handle -mfpu=.
-static unsigned getARMFPUFeatures(const Driver &D, const Arg *A,
-  const ArgList &Args, StringRef FPU,
-  std::vector &Features) {
-  unsigned FPUID = llvm::ARM::parseFPU(FPU);
-  if (!llvm::ARM::getFPUFeatures(FPUID, Features))
+static llvm::ARM::FPUKind getARMFPUFeatures(const Driver &D, const Arg *A,
+const ArgList &Args, StringRef FPU,
+std::vector &Features) {
+  llvm::ARM::FPUKind FPUKind = llvm::ARM::parseFPU(FPU);
+  if (!llvm::ARM::getFPUFeatures(FPUKind, Features))
 D.Diag(clang::diag::err_drv_clang_unsupported) << A->getAsString(Args);
-  return FPUID;
+  return FPUKind;
 }
 
 // Decode ARM features from string like +[no]featureA+[no]featureB+...
 static bool DecodeARMFeatures(const Driver &D, StringRef text, StringRef CPU,
   llvm::ARM::ArchKind ArchKind,
   std::vector &Features,
-  unsigned &ArgFPUID) {
+  llvm::ARM::FPUKind &ArgFPUKind) {
   SmallVector Split;
   text.split(Split, StringRef("+"), -1, false);
 
   for (StringRef Feature : Split) {
-if (!appendArchExtFeatures(CPU, ArchKind, Feature, Features, ArgFPUID))
+if (!appendArchExtFeatures(CPU, ArchKind, Feature, Features, ArgFPUKind))
   return false;
   }
   return true;
@@ -112,14 +112,16 @@ static void DecodeARMFeaturesFromCPU(const Driver &D, 
StringRef CPU,
 static void checkARMArchName(const Driver &D, const Arg *A, const ArgList 
&Args,
  llvm::StringRef ArchName, llvm::StringRef CPUName,
  std::vector &Features,
- const llvm::Triple &Triple, unsigned &ArgFPUID) {
+ const llvm::Triple &Triple,
+ llvm::ARM::FPUKind &ArgFPUKind) {
   std::pair Split = ArchName.split("+");
 
   std::string MArch = arm::getARMArch(ArchName, Triple);
   llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(MArch);
   if (ArchKind == llvm::ARM::ArchKind::INVALID ||
-  (Split.second.size() && !DecodeARMFeatures(D, Split.second, CPUName,
- ArchKind, Features, 
ArgFPUID)))
+  (Split.second.size() &&
+   !DecodeARMFeatures(D, Split.second, CPUName, ArchKind, Features,
+  ArgFPUKind)))
 D.Diag(clang::diag::err_drv_unsupported_option_argument)
 << A->getSpelling() << A->getValue();
 }
@@ -128,15 +130,16 @@ static void checkARMArchName(const Driver &D, const Arg 
*A, const ArgList &Args,
 static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
 llvm::StringRef CPUName, llvm::StringRef ArchName,
 std::vector &Features,
-const llvm::Triple &Triple, unsigned &ArgFPUID) {
+const llvm::Triple &Triple,
+llvm::ARM::FPUKind &

[clang] d30bc9e - [Driver] Change multilib selection algorithm

2023-03-23 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-03-24T06:58:07Z
New Revision: d30bc9e91241d69410fe1a878a66438dd752014f

URL: 
https://github.com/llvm/llvm-project/commit/d30bc9e91241d69410fe1a878a66438dd752014f
DIFF: 
https://github.com/llvm/llvm-project/commit/d30bc9e91241d69410fe1a878a66438dd752014f.diff

LOG: [Driver] Change multilib selection algorithm

The new algorithm is:
1. Find all multilibs with flags that are a subset of the requested
   flags.
2. If more than one multilib matches, choose the last.

In addition a new selection mechanism is permitted via an overload of
MultilibSet::select() for which multiple multilibs are returned.
This allows layering multilibs on top of each other.

Since multilibs are now ordered within a list, they no longer need a
Priority field.

The new algorithm is different to the old algorithm, but in practise
the old algorithm was always used in such a way that the effect is the
same.
The old algorithm was to find the set intersection of the requested
flags (with the first character of each removed) with each multilib's
flags (ditto), and for that intersection check whether the first
character matched. However, ignoring the first characters, the
requested flags were always a superset of all the multilibs flags.
Therefore the new algorithm can be used as a drop-in replacement.

The exception is Fuchsia, which needs adjusting slightly to set both
fexceptions and fno-exceptions flags.

Differential Revision: https://reviews.llvm.org/D142905

Added: 


Modified: 
clang/include/clang/Driver/Multilib.h
clang/include/clang/Driver/MultilibBuilder.h
clang/lib/Driver/Multilib.cpp
clang/lib/Driver/MultilibBuilder.cpp
clang/lib/Driver/ToolChains/Fuchsia.cpp
clang/lib/Driver/ToolChains/OHOS.cpp
clang/unittests/Driver/MultilibTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Multilib.h 
b/clang/include/clang/Driver/Multilib.h
index feb12f3638d34..9d6f1d23696b8 100644
--- a/clang/include/clang/Driver/Multilib.h
+++ b/clang/include/clang/Driver/Multilib.h
@@ -36,14 +36,13 @@ class Multilib {
   std::string OSSuffix;
   std::string IncludeSuffix;
   flags_list Flags;
-  int Priority;
 
 public:
   /// GCCSuffix, OSSuffix & IncludeSuffix will be appended directly to the
   /// sysroot string so they must either be empty or begin with a '/' 
character.
   /// This is enforced with an assert in the constructor.
   Multilib(StringRef GCCSuffix = {}, StringRef OSSuffix = {},
-   StringRef IncludeSuffix = {}, int Priority = 0,
+   StringRef IncludeSuffix = {},
const flags_list &Flags = flags_list());
 
   /// Get the detected GCC installation path suffix for the multi-arch
@@ -62,10 +61,6 @@ class Multilib {
   /// All elements begin with either '+' or '-'
   const flags_list &flags() const { return Flags; }
 
-  /// Returns the multilib priority. When more than one multilib matches flags,
-  /// the one with the highest priority is selected, with 0 being the default.
-  int priority() const { return Priority; }
-
   LLVM_DUMP_METHOD void dump() const;
   /// print summary of the Multilib
   void print(raw_ostream &OS) const;
@@ -108,6 +103,9 @@ class MultilibSet {
   const_iterator begin() const { return Multilibs.begin(); }
   const_iterator end() const { return Multilibs.end(); }
 
+  /// Select compatible variants
+  multilib_list select(const Multilib::flags_list &Flags) const;
+
   /// Pick the best multilib in the set, \returns false if none are compatible
   bool select(const Multilib::flags_list &Flags, Multilib &M) const;
 
@@ -129,13 +127,6 @@ class MultilibSet {
   }
 
   const IncludeDirsFunc &filePathsCallback() const { return FilePathsCallback; 
}
-
-private:
-  /// Apply the filter to Multilibs and return the subset that remains
-  static multilib_list filterCopy(FilterCallback F, const multilib_list &Ms);
-
-  /// Apply the filter to the multilib_list, removing those that don't match
-  static void filterInPlace(FilterCallback F, multilib_list &Ms);
 };
 
 raw_ostream &operator<<(raw_ostream &OS, const MultilibSet &MS);

diff  --git a/clang/include/clang/Driver/MultilibBuilder.h 
b/clang/include/clang/Driver/MultilibBuilder.h
index cf84c456152b1..f4875f2e03f8a 100644
--- a/clang/include/clang/Driver/MultilibBuilder.h
+++ b/clang/include/clang/Driver/MultilibBuilder.h
@@ -28,11 +28,10 @@ class MultilibBuilder {
   std::string OSSuffix;
   std::string IncludeSuffix;
   flags_list Flags;
-  int Priority;
 
 public:
   MultilibBuilder(StringRef GCCSuffix, StringRef OSSuffix,
-  StringRef IncludeSuffix, int Priority = 0);
+  StringRef IncludeSuffix);
 
   /// Initializes GCCSuffix, OSSuffix & IncludeSuffix to the same value.
   MultilibBuilder(StringRef Suffix = {});
@@ -75,10 +74,6 @@ class MultilibBuilder {
   const flags_list &flags() const { return Flags; }
   flags_list &flags() { return Flags; }

[clang] 028c103 - [Driver][BareMetal] Error if no matching multilib

2023-06-22 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-22T08:10:43+01:00
New Revision: 028c1033b1ed7b35beab736dd50053f80df02fa3

URL: 
https://github.com/llvm/llvm-project/commit/028c1033b1ed7b35beab736dd50053f80df02fa3
DIFF: 
https://github.com/llvm/llvm-project/commit/028c1033b1ed7b35beab736dd50053f80df02fa3.diff

LOG: [Driver][BareMetal] Error if no matching multilib

Previously if no matching multilib was found then the user would
typically see an error like "fatal error: 'stdio.h' file not found"
which gives no indication as to the underlying problem.
With this change the user will instead see an error like
  clang: error: no multilib found matching flags: 
--target=thumbv7em-none-unknown-eabi -march=...
  clang: note: available multilibs are:
  --target=armv4t-none-unknown-eabi
  --target=thumbv6m-none-unknown-eabi -mfpu=none
  ...

Differential Revision: https://reviews.llvm.org/D153292

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/test/Driver/baremetal-multilib.yaml

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index ff0f693061a39..635f6e755cdcb 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -733,4 +733,9 @@ def err_drv_loongarch_invalid_mfpu_EQ : Error<
 
 def err_drv_expand_response_file : Error<
   "failed to expand response file: %0">;
+
+def err_drv_no_matching_multilib : Error<
+  "no multilib found matching flags: %0">;
+def note_drv_available_multilibs : Note<
+  "available multilibs are:%0">;
 }

diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 17fd1f88975b9..09cc72f03363d 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -23,6 +23,8 @@
 #include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Support/raw_ostream.h"
 
+#include 
+
 using namespace llvm::opt;
 using namespace clang;
 using namespace clang::driver;
@@ -158,20 +160,26 @@ static bool isRISCVBareMetal(const llvm::Triple &Triple) {
   return Triple.getEnvironmentName() == "elf";
 }
 
-static bool findMultilibsFromYAML(const ToolChain &TC, const Driver &D,
+static void findMultilibsFromYAML(const ToolChain &TC, const Driver &D,
   StringRef MultilibPath, const ArgList &Args,
   DetectedMultilibs &Result) {
   llvm::ErrorOr> MB =
   D.getVFS().getBufferForFile(MultilibPath);
   if (!MB)
-return false;
+return;
   Multilib::flags_list Flags = TC.getMultilibFlags(Args);
   llvm::ErrorOr ErrorOrMultilibSet =
   MultilibSet::parseYaml(*MB.get());
   if (ErrorOrMultilibSet.getError())
-return false;
+return;
   Result.Multilibs = ErrorOrMultilibSet.get();
-  return Result.Multilibs.select(Flags, Result.SelectedMultilibs);
+  if (Result.Multilibs.select(Flags, Result.SelectedMultilibs))
+return;
+  D.Diag(clang::diag::err_drv_no_matching_multilib) << llvm::join(Flags, " ");
+  std::stringstream ss;
+  for (const Multilib &Multilib : Result.Multilibs)
+ss << "\n" << llvm::join(Multilib.flags(), " ");
+  D.Diag(clang::diag::note_drv_available_multilibs) << ss.str();
 }
 
 static constexpr llvm::StringLiteral MultilibFilename = "multilib.yaml";

diff  --git a/clang/test/Driver/baremetal-multilib.yaml 
b/clang/test/Driver/baremetal-multilib.yaml
index 93fa61ce6adf0..e3281fa3b04b6 100644
--- a/clang/test/Driver/baremetal-multilib.yaml
+++ b/clang/test/Driver/baremetal-multilib.yaml
@@ -20,6 +20,16 @@
 # CHECK-SAME: "-lc" "-lm" "-lclang_rt.builtins"
 # CHECK-SAME: "-o" "{{.*}}.tmp.out"
 
+# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -x c++ %s -### 
-o %t.out 2>&1 \
+# RUN: --target=thumbv7em-none-eabi -mfpu=fpv4-sp-d16 --sysroot= \
+# RUN:   | FileCheck --check-prefix=CHECK-NO-MATCH %s
+# CHECK-NO-MATCH: error: no multilib found matching flags:
+# CHECK-NO-MATCH-SAME: --target=thumbv7em-none-unknown-eabi
+# CHECK-NO-MATCH: note: available multilibs are:
+# CHECK-NO-MATCH: --target=thumbv6m-none-unknown-eabi -mfpu=none
+# CHECK-NO-MATCH: --target=thumbv7m-none-unknown-eabi -mfpu=none
+# CHECK-NO-MATCH: --target=thumbv7em-none-unknown-eabi -mfpu=none
+
 # RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes 
-print-multi-directory 2>&1 \
 # RUN: --target=thumbv8m.main-none-eabihf --sysroot= \
 # RUN:   | FileCheck --check-prefix=CHECK-PRINT-MULTI-DIRECTORY %s
@@ -75,6 +85,9 @@ MultilibVersion: 1.0
 # multilib, layered on top of each other.
 
 Variants:
+- Dir: arm-none-eabi/arm/v4t
+  Flags: [--target=armv4t-none-unknown-eabi]
+
 - Dir: arm-none-eabi/thumb/v6-m/nofp
   Flags: [--target=thumbv6m-none-unknown-eabi, -mfpu=none]
 



___

[clang] 041ffc1 - [Clang][Driver] Warn on invalid Arm or AArch64 baremetal target triple

2023-06-23 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-23T11:54:29+01:00
New Revision: 041ffc155fd7d154af1ea59853fbe5932d0216d3

URL: 
https://github.com/llvm/llvm-project/commit/041ffc155fd7d154af1ea59853fbe5932d0216d3
DIFF: 
https://github.com/llvm/llvm-project/commit/041ffc155fd7d154af1ea59853fbe5932d0216d3.diff

LOG: [Clang][Driver] Warn on invalid Arm or AArch64 baremetal target triple

A common user mistake is specifying a target of aarch64-none-eabi or
arm-none-elf whereas the correct names are aarch64-none-elf &
arm-none-eabi. Currently if a target of aarch64-none-eabi is specified
then the Generic_ELF toolchain is used, unlike aarch64-none-elf which
will use the BareMetal toolchain. This is unlikely to be intended by the
user so issue a warning that the target is invalid.

The target parser is liberal in what input it accepts so invalid triples
may yield behaviour that's sufficiently close to what the user intended.
Therefore invalid triples were used in many tests. This change updates
those tests to use valid triples.
One test (gnu-mcount.c) relies on the Generic_ELF toolchain behaviour so
change it to explicitly specify aarch64-unknown-none-gnu as the target.

Reviewed By: peter.smith, DavidSpickett

Differential Revision: https://reviews.llvm.org/D153430

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticCommonKinds.td
clang/lib/Driver/Driver.cpp
clang/test/CodeGen/aapcs64-align.cpp
clang/test/CodeGen/aarch64-sign-return-address.c
clang/test/CodeGen/arm_acle.c
clang/test/CodeGenCXX/float16-declarations.cpp
clang/test/Driver/aarch64-cssc.c
clang/test/Driver/aarch64-d128.c
clang/test/Driver/aarch64-hbc.c
clang/test/Driver/aarch64-ite.c
clang/test/Driver/aarch64-lrcpc3.c
clang/test/Driver/aarch64-ls64.c
clang/test/Driver/aarch64-lse128.c
clang/test/Driver/aarch64-mops.c
clang/test/Driver/aarch64-mte.c
clang/test/Driver/aarch64-perfmon.c
clang/test/Driver/aarch64-predres.c
clang/test/Driver/aarch64-rand.c
clang/test/Driver/aarch64-ras.c
clang/test/Driver/aarch64-rdm.c
clang/test/Driver/aarch64-ssbs.c
clang/test/Driver/aarch64-the.c
clang/test/Driver/arm-matrix-multiply.c
clang/test/Driver/arm-sb.c
clang/test/Driver/constructors.c
clang/test/Driver/unsupported-target-arch.c
clang/test/Frontend/gnu-mcount.c
clang/test/Headers/arm-fp16-header.c
clang/test/Headers/arm-neon-header.c
clang/test/Preprocessor/aarch64-target-features.c
llvm/test/CodeGen/AArch64/andcompare.ll
llvm/test/CodeGen/AArch64/andorbrcompare.ll
llvm/test/CodeGen/AArch64/blockaddress.ll
llvm/test/CodeGen/AArch64/extern-weak.ll
llvm/test/CodeGen/AArch64/init-array.ll
llvm/test/CodeGen/AArch64/literal_pools_float.ll
llvm/test/CodeGen/AArch64/neg-selects.ll
llvm/test/CodeGen/AArch64/qmovn.ll
llvm/test/CodeGen/AArch64/select-constant-xor.ll
llvm/test/MC/AArch64/armv8.9a-clrbhb.s

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td 
b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index eb1649cc238a5..3ccdaada1ee27 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -341,6 +341,9 @@ def err_opt_not_valid_on_target : Error<
   "option '%0' cannot be specified on this target">;
 def err_invalid_feature_combination : Error<
   "invalid feature combination: %0">;
+def warn_target_unrecognized_env : Warning<
+  "mismatch between architecture and environment in target triple '%0'; did 
you mean '%1'?">,
+  InGroup;
 
 // Source manager
 def err_cannot_open_file : Error<"cannot open file '%0': %1">, DefaultFatal;

diff  --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 4c282241d2b25..696db21d97c51 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1437,6 +1437,36 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) {
 << TC.getTriple().str();
   }
 
+  // A common user mistake is specifying a target of aarch64-none-eabi or
+  // arm-none-elf whereas the correct names are aarch64-none-elf &
+  // arm-none-eabi. Detect these cases and issue a warning.
+  if (TC.getTriple().getOS() == llvm::Triple::UnknownOS &&
+  TC.getTriple().getVendor() == llvm::Triple::UnknownVendor) {
+switch (TC.getTriple().getArch()) {
+case llvm::Triple::arm:
+case llvm::Triple::armeb:
+case llvm::Triple::thumb:
+case llvm::Triple::thumbeb:
+  if (TC.getTriple().getEnvironmentName() == "elf") {
+Diag(diag::warn_target_unrecognized_env)
+<< TargetTriple
+<< (TC.getTriple().getArchName().str() + "-none-eabi");
+  }
+  break;
+case llvm::Triple::aarch64:
+case llvm::Triple::aarch64_be:
+case llvm::Triple::aarch64_32:
+  if (TC.getTriple().getEnvironmentName().startswith("eabi")) {
+Diag(

[clang] 54c79fa - [test] Replace aarch64-*-eabi with aarch64

2023-06-29 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-29T09:06:00+01:00
New Revision: 54c79fa53c17a93d3d784738cae52d847102d279

URL: 
https://github.com/llvm/llvm-project/commit/54c79fa53c17a93d3d784738cae52d847102d279
DIFF: 
https://github.com/llvm/llvm-project/commit/54c79fa53c17a93d3d784738cae52d847102d279.diff

LOG: [test] Replace aarch64-*-eabi with aarch64

Also replace aarch64_be-*-eabi with aarch64_be

Using "eabi" for aarch64 targets is a common mistake and warned by Clang Driver.
We want to avoid it elsewhere as well. Just use the common "aarch64" without
other triple components.

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D153943

Added: 


Modified: 
clang/test/CodeGen/aarch64-bf16-lane-intrinsics.c
clang/test/CodeGen/aarch64-branch-protection-attr.c
clang/test/CodeGen/codemodels.c
clang/test/CodeGenCXX/bitfield-layout.cpp
clang/test/Driver/aarch64-features.c
clang/test/Driver/aarch64-security-options.c
clang/test/Driver/arm-wchar_t-defaults.c
clang/test/Driver/sls-hardening-options.c
clang/test/Preprocessor/init-arm.c
clang/test/Sema/aarch64-sve-alias-attribute.c
llvm/test/Analysis/MemorySSA/pr43320.ll
llvm/test/CodeGen/AArch64/arm64-aapcs-be.ll
llvm/test/CodeGen/AArch64/arm64-big-endian-varargs.ll
llvm/test/CodeGen/AArch64/arm64-ld-from-st.ll
llvm/test/CodeGen/AArch64/arm64-narrow-st-merge.ll
llvm/test/CodeGen/AArch64/arm64-trn.ll
llvm/test/CodeGen/AArch64/branch-target-enforcement-indirect-calls.ll
llvm/test/CodeGen/AArch64/bti-branch-relaxation.ll
llvm/test/CodeGen/AArch64/combine-andintoload.ll
llvm/test/CodeGen/AArch64/machine-outliner-outline-bti.ll
llvm/test/CodeGen/AArch64/stack-tagging-ex-2.ll
llvm/test/CodeGen/AArch64/tme.ll
llvm/test/DebugInfo/AArch64/big-endian.ll
llvm/test/MC/AArch64/align.s
llvm/test/MC/AArch64/directive-arch-negative.s
llvm/test/MC/AArch64/directive-arch.s
llvm/test/MC/AArch64/directive-cpu.s
llvm/test/MC/AArch64/directive-variant_pcs-err.s
llvm/test/MC/AArch64/error-location-during-layout.s
llvm/test/MC/AArch64/error-location-ldr-pseudo.s
llvm/test/MC/AArch64/error-location-post-layout.s
llvm/test/MC/AArch64/error-location.s
llvm/test/MC/AArch64/fixup-absolute-signed.s
llvm/test/MC/AArch64/fixup-absolute.s
llvm/test/MC/AArch64/fixup-out-of-range-edge.s
llvm/test/MC/AArch64/fixup-out-of-range.s
llvm/test/Transforms/LoopVectorize/AArch64/maximize-bandwidth-invalidate.ll

Removed: 




diff  --git a/clang/test/CodeGen/aarch64-bf16-lane-intrinsics.c 
b/clang/test/CodeGen/aarch64-bf16-lane-intrinsics.c
index 7f989588eca80e..ccd6d17412a8b4 100644
--- a/clang/test/CodeGen/aarch64-bf16-lane-intrinsics.c
+++ b/clang/test/CodeGen/aarch64-bf16-lane-intrinsics.c
@@ -1,7 +1,7 @@
 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
 // RUN: %clang_cc1 -triple aarch64 -target-feature +neon -target-feature +bf16 
\
 // RUN:  -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | 
FileCheck --check-prefix=CHECK-LE %s
-// RUN: %clang_cc1 -triple aarch64_be-arm-none-eabi -target-feature +neon 
-target-feature +bf16 \
+// RUN: %clang_cc1 -triple aarch64_be -target-feature +neon -target-feature 
+bf16 \
 // RUN:  -disable-O0-optnone -emit-llvm %s -o - | opt -S -passes=mem2reg | 
FileCheck --check-prefix=CHECK-BE %s
 
 // REQUIRES: aarch64-registered-target || arm-registered-target

diff  --git a/clang/test/CodeGen/aarch64-branch-protection-attr.c 
b/clang/test/CodeGen/aarch64-branch-protection-attr.c
index a7f600989b6e69..3c2714e2feda24 100644
--- a/clang/test/CodeGen/aarch64-branch-protection-attr.c
+++ b/clang/test/CodeGen/aarch64-branch-protection-attr.c
@@ -1,5 +1,5 @@
 // REQUIRES: aarch64-registered-target
-// RUN: %clang_cc1 -triple aarch64-unknown-unknown-eabi -emit-llvm  
-target-cpu generic -target-feature +v8.5a %s -o - \
+// RUN: %clang_cc1 -triple aarch64 -emit-llvm  -target-cpu generic 
-target-feature +v8.5a %s -o - \
 // RUN:   | FileCheck %s --check-prefix=CHECK
 
 __attribute__ ((target("branch-protection=none")))

diff  --git a/clang/test/CodeGen/codemodels.c b/clang/test/CodeGen/codemodels.c
index a302016c66d7be..edc1815d475fd4 100644
--- a/clang/test/CodeGen/codemodels.c
+++ b/clang/test/CodeGen/codemodels.c
@@ -1,5 +1,5 @@
 // RUN: %clang_cc1 -emit-llvm  %s -o - | FileCheck %s 
-check-prefix=CHECK-NOMODEL
-// RUN: %clang_cc1 -triple aarch64-unknown-none-eabi -emit-llvm -mcmodel=tiny 
%s -o - | FileCheck %s -check-prefix=CHECK-TINY
+// RUN: %clang_cc1 -triple aarch64 -emit-llvm -mcmodel=tiny %s -o - | 
FileCheck %s -check-prefix=CHECK-TINY
 // RUN: %clang_cc1 -emit-llvm -mcmodel=small %s -o - | FileCheck %s 
-check-prefix=CHECK-SMALL
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -mcmodel=kernel 
%s -o - | FileCheck %s -check-prefix=CHE

[clang] dc8cbbd - [Clang][Driver] Change missing multilib error to warning

2023-06-29 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-29T09:08:15+01:00
New Revision: dc8cbbd55f807e832bf8c500205b0f4184531b00

URL: 
https://github.com/llvm/llvm-project/commit/dc8cbbd55f807e832bf8c500205b0f4184531b00
DIFF: 
https://github.com/llvm/llvm-project/commit/dc8cbbd55f807e832bf8c500205b0f4184531b00.diff

LOG: [Clang][Driver] Change missing multilib error to warning

The error could be awkward to work around when experimenting with flags
that didn't have a matching multilib. It also broke many tests when
multilib.yaml was present in the build directory.

Reviewed By: simon_tatham, MaskRay

Differential Revision: https://reviews.llvm.org/D153885

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/test/Driver/baremetal-multilib.yaml

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index d2253bb84a0441..d8112641eaf58f 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -737,8 +737,9 @@ def err_drv_loongarch_invalid_mfpu_EQ : Error<
 def err_drv_expand_response_file : Error<
   "failed to expand response file: %0">;
 
-def err_drv_no_matching_multilib : Error<
-  "no multilib found matching flags: %0">;
+def warn_drv_missing_multilib : Warning<
+  "no multilib found matching flags: %0">,
+  InGroup>;
 def note_drv_available_multilibs : Note<
   "available multilibs are:%0">;
 }

diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 47a533501ec730..d56bfafe6dfe1f 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -175,7 +175,7 @@ static void findMultilibsFromYAML(const ToolChain &TC, 
const Driver &D,
   Result.Multilibs = ErrorOrMultilibSet.get();
   if (Result.Multilibs.select(Flags, Result.SelectedMultilibs))
 return;
-  D.Diag(clang::diag::err_drv_no_matching_multilib) << llvm::join(Flags, " ");
+  D.Diag(clang::diag::warn_drv_missing_multilib) << llvm::join(Flags, " ");
   std::stringstream ss;
   for (const Multilib &Multilib : Result.Multilibs)
 ss << "\n" << llvm::join(Multilib.flags(), " ");

diff  --git a/clang/test/Driver/baremetal-multilib.yaml 
b/clang/test/Driver/baremetal-multilib.yaml
index e3281fa3b04b6e..af26e82621c91e 100644
--- a/clang/test/Driver/baremetal-multilib.yaml
+++ b/clang/test/Driver/baremetal-multilib.yaml
@@ -23,7 +23,7 @@
 # RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -x c++ %s -### 
-o %t.out 2>&1 \
 # RUN: --target=thumbv7em-none-eabi -mfpu=fpv4-sp-d16 --sysroot= \
 # RUN:   | FileCheck --check-prefix=CHECK-NO-MATCH %s
-# CHECK-NO-MATCH: error: no multilib found matching flags:
+# CHECK-NO-MATCH: warning: no multilib found matching flags:
 # CHECK-NO-MATCH-SAME: --target=thumbv7em-none-unknown-eabi
 # CHECK-NO-MATCH: note: available multilibs are:
 # CHECK-NO-MATCH: --target=thumbv6m-none-unknown-eabi -mfpu=none



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] f28c28e - Simplify test from change D73904

2023-02-09 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-02-09T10:05:01Z
New Revision: f28c28e6645723c01c73478a9d18f0bf0551767a

URL: 
https://github.com/llvm/llvm-project/commit/f28c28e6645723c01c73478a9d18f0bf0551767a
DIFF: 
https://github.com/llvm/llvm-project/commit/f28c28e6645723c01c73478a9d18f0bf0551767a.diff

LOG: Simplify test from change D73904

This part of the test can break if multilib is enabled, and isn't
important to testing the change with which is was added.

The relevant part of the test is
ARM-EABI: "-lclang_rt.builtins-arm"
which remains.

Differential Revision: https://reviews.llvm.org/D143590

Added: 


Modified: 
clang/test/Driver/arm-compiler-rt.c

Removed: 




diff  --git a/clang/test/Driver/arm-compiler-rt.c 
b/clang/test/Driver/arm-compiler-rt.c
index a8ea38a7da3c5..a101396862c58 100644
--- a/clang/test/Driver/arm-compiler-rt.c
+++ b/clang/test/Driver/arm-compiler-rt.c
@@ -2,7 +2,6 @@
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-EABI
-// ARM-EABI: 
"-L{{.*[/\\]}}Inputs/resource_dir_with_arch_subdir{{/|}}lib{{/|}}baremetal"
 // ARM-EABI: "-lclang_rt.builtins-arm"
 
 // RUN: %clang -target arm-linux-gnueabi \



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] d61a863 - [Clang] Fix clang_rt tests when LLVM_ENABLE_PER_TARGET_RUNTIME_DIR is ON

2023-02-21 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-02-22T07:45:16Z
New Revision: d61a863050bb4afd22d08bbe53af1e24c0657aba

URL: 
https://github.com/llvm/llvm-project/commit/d61a863050bb4afd22d08bbe53af1e24c0657aba
DIFF: 
https://github.com/llvm/llvm-project/commit/d61a863050bb4afd22d08bbe53af1e24c0657aba.diff

LOG: [Clang] Fix clang_rt tests when LLVM_ENABLE_PER_TARGET_RUNTIME_DIR is ON

If clang is part of a toolchain that can locate clang_rt libraries
outside its resource directory and these are built with
LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON then the tests would fail because
the library names don't have the arch suffix. This change makes the arch
suffix optional.

Differential Revision: https://reviews.llvm.org/D143666

Added: 


Modified: 
clang/test/Driver/arm-compiler-rt.c
clang/test/Driver/print-libgcc-file-name-clangrt.c

Removed: 




diff  --git a/clang/test/Driver/arm-compiler-rt.c 
b/clang/test/Driver/arm-compiler-rt.c
index a101396862c58..b31e210b0376f 100644
--- a/clang/test/Driver/arm-compiler-rt.c
+++ b/clang/test/Driver/arm-compiler-rt.c
@@ -2,47 +2,47 @@
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-EABI
-// ARM-EABI: "-lclang_rt.builtins-arm"
+// ARM-EABI: "-lclang_rt.builtins{{(-arm)?}}"
 
 // RUN: %clang -target arm-linux-gnueabi \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABI
-// ARM-GNUEABI: "{{.*[/\\]}}libclang_rt.builtins-arm.a"
+// ARM-GNUEABI: "{{.*[/\\]}}libclang_rt.builtins{{(-arm)?}}.a"
 
 // RUN: %clang -target arm-linux-gnueabi \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -mfloat-abi=hard -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABI-ABI
-// ARM-GNUEABI-ABI: "{{.*[/\\]}}libclang_rt.builtins-armhf.a"
+// ARM-GNUEABI-ABI: "{{.*[/\\]}}libclang_rt.builtins{{(-armhf)?}}.a"
 
 // RUN: %clang -target arm-linux-gnueabihf \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABIHF
-// ARM-GNUEABIHF: "{{.*[/\\]}}libclang_rt.builtins-armhf.a"
+// ARM-GNUEABIHF: "{{.*[/\\]}}libclang_rt.builtins{{(-armhf)?}}.a"
 
 // RUN: %clang -target arm-linux-gnueabihf \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -mfloat-abi=soft -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABIHF-ABI
-// ARM-GNUEABIHF-ABI: "{{.*[/\\]}}libclang_rt.builtins-arm.a"
+// ARM-GNUEABIHF-ABI: "{{.*[/\\]}}libclang_rt.builtins{{(-arm)?}}.a"
 
 // RUN: %clang -target arm-windows-itanium \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-WINDOWS
-// ARM-WINDOWS: "{{.*[/\\]}}clang_rt.builtins-arm.lib"
+// ARM-WINDOWS: "{{.*[/\\]}}clang_rt.builtins{{(-arm)?}}.lib"
 
 // RUN: %clang -target arm-linux-androideabi \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-ANDROID
-// ARM-ANDROID: "{{.*[/\\]}}libclang_rt.builtins-arm-android.a"
+// ARM-ANDROID: "{{.*[/\\]}}libclang_rt.builtins{{(-arm-android)?}}.a"
 
 // RUN: %clang -target arm-linux-androideabi \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -mfloat-abi=hard -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-ANDROIDHF
-// ARM-ANDROIDHF: "{{.*[/\\]}}libclang_rt.builtins-armhf-android.a"
+// ARM-ANDROIDHF: "{{.*[/\\]}}libclang_rt.builtins{{(-armhf-android)?}}.a"
 

diff  --git a/clang/test/Driver/print-libgcc-file-name-clangrt.c 
b/clang/test/Driver/print-libgcc-file-name-clangrt.c
index 5084c9966474f..6e6e73213c212 100644
--- a/clang/test/Driver/print-libgcc-file-name-clangrt.c
+++ b/clang/test/Driver/print-libgcc-file-name-clangrt.c
@@ -4,13 +4,13 @@
 // RUN: --target=x86_64-pc-linux \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN:   | FileCheck --check-prefix=CHECK-CLANGRT-X8664 %s
-// CHECK-CLANGRT-X8664: libclang_rt.builtins-x86_64.a
+// CHECK-CLANGRT-X8664: libclang_rt.builtins{{(-x86_64)?}}.a
 
 // RUN: %clang -rtlib=compiler-rt -print-libgcc-file-name 2>&1 \
 // RUN: --target=i386-pc-linux \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN:   | FileCheck --check-prefix=CHECK-CLANGRT-I386 %s
-// CHECK-CLANGRT-I386: libclang_rt.builtins-i386.a
+// CHECK-CLANGRT-I386: libclang_rt.builtins{{(-i386)?}}.a
 
 // Check whether alternate arch values map to the correct library.
 //
@@ -23,7 +23,7 @@
 // RUN: --target=arm-linux-gnueabi \
 // RUN: -reso

[clang] 67e28a3 - [Clang] Improve hermeticity of clang_rt tests

2023-02-22 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-02-22T09:23:10Z
New Revision: 67e28a3010e1852ec670cf5346fd171bf2a16774

URL: 
https://github.com/llvm/llvm-project/commit/67e28a3010e1852ec670cf5346fd171bf2a16774
DIFF: 
https://github.com/llvm/llvm-project/commit/67e28a3010e1852ec670cf5346fd171bf2a16774.diff

LOG: [Clang] Improve hermeticity of clang_rt tests

Specifying --sysroot prevents libclang_rt from being located in standard
library directories.

Differential Revision: https://reviews.llvm.org/D144542

Added: 


Modified: 
clang/test/Driver/arm-compiler-rt.c
clang/test/Driver/print-libgcc-file-name-clangrt.c

Removed: 




diff  --git a/clang/test/Driver/arm-compiler-rt.c 
b/clang/test/Driver/arm-compiler-rt.c
index b31e210b0376f..8b9bcfe778097 100644
--- a/clang/test/Driver/arm-compiler-rt.c
+++ b/clang/test/Driver/arm-compiler-rt.c
@@ -1,48 +1,56 @@
 // RUN: %clang -target arm-none-eabi \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-EABI
-// ARM-EABI: "-lclang_rt.builtins{{(-arm)?}}"
+// ARM-EABI: "-lclang_rt.builtins-arm"
 
 // RUN: %clang -target arm-linux-gnueabi \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABI
-// ARM-GNUEABI: "{{.*[/\\]}}libclang_rt.builtins{{(-arm)?}}.a"
+// ARM-GNUEABI: "{{.*[/\\]}}libclang_rt.builtins-arm.a"
 
 // RUN: %clang -target arm-linux-gnueabi \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -mfloat-abi=hard -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABI-ABI
-// ARM-GNUEABI-ABI: "{{.*[/\\]}}libclang_rt.builtins{{(-armhf)?}}.a"
+// ARM-GNUEABI-ABI: "{{.*[/\\]}}libclang_rt.builtins-armhf.a"
 
 // RUN: %clang -target arm-linux-gnueabihf \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABIHF
-// ARM-GNUEABIHF: "{{.*[/\\]}}libclang_rt.builtins{{(-armhf)?}}.a"
+// ARM-GNUEABIHF: "{{.*[/\\]}}libclang_rt.builtins-armhf.a"
 
 // RUN: %clang -target arm-linux-gnueabihf \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -mfloat-abi=soft -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-GNUEABIHF-ABI
-// ARM-GNUEABIHF-ABI: "{{.*[/\\]}}libclang_rt.builtins{{(-arm)?}}.a"
+// ARM-GNUEABIHF-ABI: "{{.*[/\\]}}libclang_rt.builtins-arm.a"
 
 // RUN: %clang -target arm-windows-itanium \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-WINDOWS
-// ARM-WINDOWS: "{{.*[/\\]}}clang_rt.builtins{{(-arm)?}}.lib"
+// ARM-WINDOWS: "{{.*[/\\]}}clang_rt.builtins-arm.lib"
 
 // RUN: %clang -target arm-linux-androideabi \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-ANDROID
-// ARM-ANDROID: "{{.*[/\\]}}libclang_rt.builtins{{(-arm-android)?}}.a"
+// ARM-ANDROID: "{{.*[/\\]}}libclang_rt.builtins-arm-android.a"
 
 // RUN: %clang -target arm-linux-androideabi \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -rtlib=compiler-rt -mfloat-abi=hard -### %s 2>&1 \
 // RUN:   | FileCheck %s -check-prefix ARM-ANDROIDHF
-// ARM-ANDROIDHF: "{{.*[/\\]}}libclang_rt.builtins{{(-armhf-android)?}}.a"
+// ARM-ANDROIDHF: "{{.*[/\\]}}libclang_rt.builtins-armhf-android.a"
 

diff  --git a/clang/test/Driver/print-libgcc-file-name-clangrt.c 
b/clang/test/Driver/print-libgcc-file-name-clangrt.c
index 6e6e73213c212..d5e7c48dde296 100644
--- a/clang/test/Driver/print-libgcc-file-name-clangrt.c
+++ b/clang/test/Driver/print-libgcc-file-name-clangrt.c
@@ -2,55 +2,64 @@
 
 // RUN: %clang -rtlib=compiler-rt -print-libgcc-file-name 2>&1 \
 // RUN: --target=x86_64-pc-linux \
+// RUN: --sysroot=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \
 // RUN:   | FileCheck --check-prefix=CHECK-CLANGRT-X8664 %s
-// CHECK-CLANGRT-X8664: libclang_rt.builtins{{(-x86_64)?}}.a
+// CHECK-CLANGRT-X8664: libclang_rt.builtins-x86_64.a
 
 // RUN: %clang -rtli

[clang] 850dab0 - [NFC] Class for building MultilibSet

2023-02-22 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-02-22T09:24:48Z
New Revision: 850dab0f2537bb31103578fc35caef2f1ad98f04

URL: 
https://github.com/llvm/llvm-project/commit/850dab0f2537bb31103578fc35caef2f1ad98f04
DIFF: 
https://github.com/llvm/llvm-project/commit/850dab0f2537bb31103578fc35caef2f1ad98f04.diff

LOG: [NFC] Class for building MultilibSet

The functionality in MultilibSet for creating it is tied to its current
implementation. Putting that code in a separate class is an enabler for
changing the MultilibSet implementation.

Differential Revision: https://reviews.llvm.org/D142893

Added: 
clang/include/clang/Driver/MultilibBuilder.h
clang/lib/Driver/MultilibBuilder.cpp
clang/unittests/Driver/MultilibBuilderTest.cpp

Modified: 
clang/include/clang/Driver/Multilib.h
clang/lib/Driver/CMakeLists.txt
clang/lib/Driver/Multilib.cpp
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/lib/Driver/ToolChains/Fuchsia.cpp
clang/lib/Driver/ToolChains/Gnu.cpp
clang/unittests/Driver/CMakeLists.txt
clang/unittests/Driver/MultilibTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Multilib.h 
b/clang/include/clang/Driver/Multilib.h
index cf2dbf6ff58a6..feb12f3638d34 100644
--- a/clang/include/clang/Driver/Multilib.h
+++ b/clang/include/clang/Driver/Multilib.h
@@ -24,7 +24,9 @@ namespace clang {
 namespace driver {
 
 /// This corresponds to a single GCC Multilib, or a segment of one controlled
-/// by a command line flag
+/// by a command line flag.
+/// See also MultilibBuilder for building a multilib by mutating it
+/// incrementally.
 class Multilib {
 public:
   using flags_list = std::vector;
@@ -37,71 +39,37 @@ class Multilib {
   int Priority;
 
 public:
+  /// GCCSuffix, OSSuffix & IncludeSuffix will be appended directly to the
+  /// sysroot string so they must either be empty or begin with a '/' 
character.
+  /// This is enforced with an assert in the constructor.
   Multilib(StringRef GCCSuffix = {}, StringRef OSSuffix = {},
-   StringRef IncludeSuffix = {}, int Priority = 0);
+   StringRef IncludeSuffix = {}, int Priority = 0,
+   const flags_list &Flags = flags_list());
 
   /// Get the detected GCC installation path suffix for the multi-arch
   /// target variant. Always starts with a '/', unless empty
-  const std::string &gccSuffix() const {
-assert(GCCSuffix.empty() ||
-   (StringRef(GCCSuffix).front() == '/' && GCCSuffix.size() > 1));
-return GCCSuffix;
-  }
-
-  /// Set the GCC installation path suffix.
-  Multilib &gccSuffix(StringRef S);
+  const std::string &gccSuffix() const { return GCCSuffix; }
 
   /// Get the detected os path suffix for the multi-arch
   /// target variant. Always starts with a '/', unless empty
-  const std::string &osSuffix() const {
-assert(OSSuffix.empty() ||
-   (StringRef(OSSuffix).front() == '/' && OSSuffix.size() > 1));
-return OSSuffix;
-  }
-
-  /// Set the os path suffix.
-  Multilib &osSuffix(StringRef S);
+  const std::string &osSuffix() const { return OSSuffix; }
 
   /// Get the include directory suffix. Always starts with a '/', unless
   /// empty
-  const std::string &includeSuffix() const {
-assert(IncludeSuffix.empty() ||
-   (StringRef(IncludeSuffix).front() == '/' && IncludeSuffix.size() > 
1));
-return IncludeSuffix;
-  }
-
-  /// Set the include directory suffix
-  Multilib &includeSuffix(StringRef S);
+  const std::string &includeSuffix() const { return IncludeSuffix; }
 
   /// Get the flags that indicate or contraindicate this multilib's use
   /// All elements begin with either '+' or '-'
   const flags_list &flags() const { return Flags; }
-  flags_list &flags() { return Flags; }
 
   /// Returns the multilib priority. When more than one multilib matches flags,
   /// the one with the highest priority is selected, with 0 being the default.
   int priority() const { return Priority; }
 
-  /// Add a flag to the flags list
-  /// \p Flag must be a flag accepted by the driver with its leading '-' 
removed,
-  /// and replaced with either:
-  ///   '-' which contraindicates using this multilib with that flag
-  /// or:
-  ///   '+' which promotes using this multilib in the presence of that flag
-  /// otherwise '-print-multi-lib' will not emit them correctly.
-  Multilib &flag(StringRef F) {
-assert(F.front() == '+' || F.front() == '-');
-Flags.push_back(std::string(F));
-return *this;
-  }
-
   LLVM_DUMP_METHOD void dump() const;
   /// print summary of the Multilib
   void print(raw_ostream &OS) const;
 
-  /// Check whether any of the 'against' flags contradict the 'for' flags.
-  bool isValid() const;
-
   /// Check whether the default is selected
   bool isDefault() const
   { return GCCSuffix.empty() && OSSuffix.empty() && IncludeSuffix.empty(); }
@@ -111,10 +79,10 @@ class Multilib {
 
 raw_ostream &operator<<(raw_o

[clang] c8a23ec - [NFC][Driver] Fix -Wdangling-else warning

2023-05-18 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-05-18T21:16:56+01:00
New Revision: c8a23ec0cbac460dbbefb6683cdbed49e5472086

URL: 
https://github.com/llvm/llvm-project/commit/c8a23ec0cbac460dbbefb6683cdbed49e5472086
DIFF: 
https://github.com/llvm/llvm-project/commit/c8a23ec0cbac460dbbefb6683cdbed49e5472086.diff

LOG: [NFC][Driver] Fix -Wdangling-else warning

GCC emits this warning because the EXPECT_STREQ macro contains an
if-else statement:

  warning: suggest explicit braces to avoid ambiguous ‘else’ [-Wdangling-else]

Added: 


Modified: 
clang/unittests/Driver/DXCModeTest.cpp

Removed: 




diff  --git a/clang/unittests/Driver/DXCModeTest.cpp 
b/clang/unittests/Driver/DXCModeTest.cpp
index c30f3c34a7fea..b3767c042edb2 100644
--- a/clang/unittests/Driver/DXCModeTest.cpp
+++ b/clang/unittests/Driver/DXCModeTest.cpp
@@ -137,8 +137,9 @@ TEST(DxcModeTest, ValidatorVersionValidation) {
 auto *A = TranslatedArgs->getLastArg(
 clang::driver::options::OPT_dxil_validator_version);
 EXPECT_NE(A, nullptr);
-if (A)
+if (A) {
   EXPECT_STREQ(A->getValue(), "1.1");
+}
   }
   EXPECT_EQ(Diags.getNumErrors(), 0u);
 



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 1d511e1 - [ARM][Driver] Warn if -mhard-float is incompatible

2023-06-06 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-06T09:08:37+01:00
New Revision: 1d511e1864f142d08a491a89940d70c516a6c6a2

URL: 
https://github.com/llvm/llvm-project/commit/1d511e1864f142d08a491a89940d70c516a6c6a2
DIFF: 
https://github.com/llvm/llvm-project/commit/1d511e1864f142d08a491a89940d70c516a6c6a2.diff

LOG: [ARM][Driver] Warn if -mhard-float is incompatible

Mixing -mfloat-abi=hard with a CPU that doesn't have floating point
registers is an error in GCC:
  cc1: error: '-mfloat-abi=hard': selected processor lacks an FPU

Since there is code in the wild (including in clang tests) that relies
on Clang's current behaviour, emit a warning instead of an error.

Unlike the GCC error, the new warning refers to floating point
registers instead of an FPU. This is because -mfloat-abi=hard and
-march=armv8.1-m.main+mve+nofp are compatible - in that case floating
point registers are required, but an FPU is not required.

My initial thought was to use the floating point ABI calculated by
arm::getARMFloatABI() but in invalid cases which error for other
reasons the ABI is miscalculated and the warning would cause confusion.
Therefore only warn if the user specifies the float ABI explicitly.

Fixes part of https://github.com/llvm/llvm-project/issues/55755

Differential Revision: https://reviews.llvm.org/D150902

Added: 
clang/test/Driver/arm-no-float-regs.c

Modified: 
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/Arch/ARM.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index d7e59879cfa58..0fce8d414336d 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -417,6 +417,8 @@ def warn_drv_assuming_mfloat_abi_is : Warning<
 def warn_drv_unsupported_float_abi_by_lib : Warning<
   "float ABI '%0' is not supported by current library">,
   InGroup>;
+def warn_drv_no_floating_point_registers: Warning<
+  "'%0': selected processor lacks floating point registers">;
 def warn_ignoring_ftabstop_value : Warning<
   "ignoring invalid -ftabstop value '%0', using default value %1">;
 def warn_drv_overriding_flag_option : Warning<

diff  --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp 
b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
index d5d5ec6114a1d..705457805ed64 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -144,6 +144,22 @@ static void checkARMCPUName(const Driver &D, const Arg *A, 
const ArgList &Args,
 << A->getSpelling() << A->getValue();
 }
 
+// If -mfloat-abi=hard or -mhard-float are specified explicitly then check that
+// floating point registers are available on the target CPU.
+static void checkARMFloatABI(const Driver &D, const ArgList &Args,
+ bool HasFPRegs) {
+  if (HasFPRegs)
+return;
+  const Arg *A =
+  Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
+  options::OPT_mfloat_abi_EQ);
+  if (A && (A->getOption().matches(options::OPT_mhard_float) ||
+(A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
+ A->getValue() == StringRef("hard"
+D.Diag(clang::diag::warn_drv_no_floating_point_registers)
+<< A->getAsString(Args);
+}
+
 bool arm::useAAPCSForMachO(const llvm::Triple &T) {
   // The backend is hardwired to assume AAPCS for M-class processors, ensure
   // the frontend matches that.
@@ -636,13 +652,15 @@ void arm::getARMTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
   // -march/-mcpu effectively disables the FPU (GCC ignores the -mfpu options 
in
   // this case). Note that the ABI can also be set implicitly by the target
   // selected.
+  bool HasFPRegs = true;
   if (ABI == arm::FloatABI::Soft) {
 llvm::ARM::getFPUFeatures(llvm::ARM::FK_NONE, Features);
 
 // Disable all features relating to hardware FP, not already disabled by 
the
 // above call.
-Features.insert(Features.end(), {"-dotprod", "-fp16fml", "-bf16", "-mve",
- "-mve.fp", "-fpregs"});
+Features.insert(Features.end(),
+{"-dotprod", "-fp16fml", "-bf16", "-mve", "-mve.fp"});
+HasFPRegs = false;
   } else if (FPUKind == llvm::ARM::FK_NONE ||
  ArchArgFPUKind == llvm::ARM::FK_NONE ||
  CPUArgFPUKind == llvm::ARM::FK_NONE) {
@@ -652,9 +670,10 @@ void arm::getARMTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
 // latter, is still supported.
 Features.insert(Features.end(),
 {"-dotprod", "-fp16fml", "-bf16", "-mve.fp"});
-if (!hasIntegerMVE(Features))
-  Features.emplace_back("-fpregs");
+HasFPRegs = hasIntegerMVE(Features);
   }
+  if (!HasFPRegs)
+Features.emplace_back("-fpregs");
 
   // En/disable crc code generation.
   if

[clang] fcd2fad - Revert "[ARM][Driver] Warn if -mhard-float is incompatible"

2023-06-06 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-06T11:05:46+01:00
New Revision: fcd2fadd0b8c2c2140615efaa9df0148f004f8dd

URL: 
https://github.com/llvm/llvm-project/commit/fcd2fadd0b8c2c2140615efaa9df0148f004f8dd
DIFF: 
https://github.com/llvm/llvm-project/commit/fcd2fadd0b8c2c2140615efaa9df0148f004f8dd.diff

LOG: Revert "[ARM][Driver] Warn if -mhard-float is incompatible"

An associated -W flag is needed.

This reverts commit 1d511e1864f142d08a491a89940d70c516a6c6a2.

Added: 


Modified: 
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/Arch/ARM.cpp

Removed: 
clang/test/Driver/arm-no-float-regs.c



diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 0fce8d414336d..d7e59879cfa58 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -417,8 +417,6 @@ def warn_drv_assuming_mfloat_abi_is : Warning<
 def warn_drv_unsupported_float_abi_by_lib : Warning<
   "float ABI '%0' is not supported by current library">,
   InGroup>;
-def warn_drv_no_floating_point_registers: Warning<
-  "'%0': selected processor lacks floating point registers">;
 def warn_ignoring_ftabstop_value : Warning<
   "ignoring invalid -ftabstop value '%0', using default value %1">;
 def warn_drv_overriding_flag_option : Warning<

diff  --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp 
b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
index 705457805ed64..d5d5ec6114a1d 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -144,22 +144,6 @@ static void checkARMCPUName(const Driver &D, const Arg *A, 
const ArgList &Args,
 << A->getSpelling() << A->getValue();
 }
 
-// If -mfloat-abi=hard or -mhard-float are specified explicitly then check that
-// floating point registers are available on the target CPU.
-static void checkARMFloatABI(const Driver &D, const ArgList &Args,
- bool HasFPRegs) {
-  if (HasFPRegs)
-return;
-  const Arg *A =
-  Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
-  options::OPT_mfloat_abi_EQ);
-  if (A && (A->getOption().matches(options::OPT_mhard_float) ||
-(A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
- A->getValue() == StringRef("hard"
-D.Diag(clang::diag::warn_drv_no_floating_point_registers)
-<< A->getAsString(Args);
-}
-
 bool arm::useAAPCSForMachO(const llvm::Triple &T) {
   // The backend is hardwired to assume AAPCS for M-class processors, ensure
   // the frontend matches that.
@@ -652,15 +636,13 @@ void arm::getARMTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
   // -march/-mcpu effectively disables the FPU (GCC ignores the -mfpu options 
in
   // this case). Note that the ABI can also be set implicitly by the target
   // selected.
-  bool HasFPRegs = true;
   if (ABI == arm::FloatABI::Soft) {
 llvm::ARM::getFPUFeatures(llvm::ARM::FK_NONE, Features);
 
 // Disable all features relating to hardware FP, not already disabled by 
the
 // above call.
-Features.insert(Features.end(),
-{"-dotprod", "-fp16fml", "-bf16", "-mve", "-mve.fp"});
-HasFPRegs = false;
+Features.insert(Features.end(), {"-dotprod", "-fp16fml", "-bf16", "-mve",
+ "-mve.fp", "-fpregs"});
   } else if (FPUKind == llvm::ARM::FK_NONE ||
  ArchArgFPUKind == llvm::ARM::FK_NONE ||
  CPUArgFPUKind == llvm::ARM::FK_NONE) {
@@ -670,10 +652,9 @@ void arm::getARMTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
 // latter, is still supported.
 Features.insert(Features.end(),
 {"-dotprod", "-fp16fml", "-bf16", "-mve.fp"});
-HasFPRegs = hasIntegerMVE(Features);
+if (!hasIntegerMVE(Features))
+  Features.emplace_back("-fpregs");
   }
-  if (!HasFPRegs)
-Features.emplace_back("-fpregs");
 
   // En/disable crc code generation.
   if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
@@ -929,8 +910,6 @@ void arm::getARMTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
 
   if (Args.getLastArg(options::OPT_mno_bti_at_return_twice))
 Features.push_back("+no-bti-at-return-twice");
-
-  checkARMFloatABI(D, Args, HasFPRegs);
 }
 
 std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {

diff  --git a/clang/test/Driver/arm-no-float-regs.c 
b/clang/test/Driver/arm-no-float-regs.c
deleted file mode 100644
index b542f7d2805fe..0
--- a/clang/test/Driver/arm-no-float-regs.c
+++ /dev/null
@@ -1,23 +0,0 @@
-// REQUIRES: arm-registered-target
-
-// Check that -mfloat-abi=hard gives a warning if FP registers aren't 
available.
-// RUN: %clang --target=arm-none-eabi -mcpu=cortex-m0 -mfloat-abi=hard -### -c 
%s 2>&1
-
-//

[clang] 28ba4b2 - [ARM][Driver] Warn if -mhard-float is incompatible

2023-06-06 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-06T11:39:19+01:00
New Revision: 28ba4b23177e90fa94c88f0bd9a99eb46dbc82c3

URL: 
https://github.com/llvm/llvm-project/commit/28ba4b23177e90fa94c88f0bd9a99eb46dbc82c3
DIFF: 
https://github.com/llvm/llvm-project/commit/28ba4b23177e90fa94c88f0bd9a99eb46dbc82c3.diff

LOG: [ARM][Driver] Warn if -mhard-float is incompatible

Mixing -mfloat-abi=hard with a CPU that doesn't have floating point
registers is an error in GCC:
  cc1: error: '-mfloat-abi=hard': selected processor lacks an FPU

Since there is code in the wild (including in clang tests) that relies
on Clang's current behaviour, emit a warning instead of an error.

Unlike the GCC error, the new warning refers to floating point
registers instead of an FPU. This is because -mfloat-abi=hard and
-march=armv8.1-m.main+mve+nofp are compatible - in that case floating
point registers are required, but an FPU is not required.

My initial thought was to use the floating point ABI calculated by
arm::getARMFloatABI() but in invalid cases which error for other
reasons the ABI is miscalculated and the warning would cause confusion.
Therefore only warn if the user specifies the float ABI explicitly.

Fixes part of https://github.com/llvm/llvm-project/issues/55755

Differential Revision: https://reviews.llvm.org/D150902

Added: 
clang/test/Driver/arm-no-float-regs.c

Modified: 
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/Arch/ARM.cpp

Removed: 




diff  --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td 
b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index d7e59879cfa58..ff0f693061a39 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -417,6 +417,9 @@ def warn_drv_assuming_mfloat_abi_is : Warning<
 def warn_drv_unsupported_float_abi_by_lib : Warning<
   "float ABI '%0' is not supported by current library">,
   InGroup>;
+def warn_drv_no_floating_point_registers: Warning<
+  "'%0': selected processor lacks floating point registers; flag ignored">,
+  InGroup;
 def warn_ignoring_ftabstop_value : Warning<
   "ignoring invalid -ftabstop value '%0', using default value %1">;
 def warn_drv_overriding_flag_option : Warning<

diff  --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp 
b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
index d5d5ec6114a1d..705457805ed64 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -144,6 +144,22 @@ static void checkARMCPUName(const Driver &D, const Arg *A, 
const ArgList &Args,
 << A->getSpelling() << A->getValue();
 }
 
+// If -mfloat-abi=hard or -mhard-float are specified explicitly then check that
+// floating point registers are available on the target CPU.
+static void checkARMFloatABI(const Driver &D, const ArgList &Args,
+ bool HasFPRegs) {
+  if (HasFPRegs)
+return;
+  const Arg *A =
+  Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
+  options::OPT_mfloat_abi_EQ);
+  if (A && (A->getOption().matches(options::OPT_mhard_float) ||
+(A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
+ A->getValue() == StringRef("hard"
+D.Diag(clang::diag::warn_drv_no_floating_point_registers)
+<< A->getAsString(Args);
+}
+
 bool arm::useAAPCSForMachO(const llvm::Triple &T) {
   // The backend is hardwired to assume AAPCS for M-class processors, ensure
   // the frontend matches that.
@@ -636,13 +652,15 @@ void arm::getARMTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
   // -march/-mcpu effectively disables the FPU (GCC ignores the -mfpu options 
in
   // this case). Note that the ABI can also be set implicitly by the target
   // selected.
+  bool HasFPRegs = true;
   if (ABI == arm::FloatABI::Soft) {
 llvm::ARM::getFPUFeatures(llvm::ARM::FK_NONE, Features);
 
 // Disable all features relating to hardware FP, not already disabled by 
the
 // above call.
-Features.insert(Features.end(), {"-dotprod", "-fp16fml", "-bf16", "-mve",
- "-mve.fp", "-fpregs"});
+Features.insert(Features.end(),
+{"-dotprod", "-fp16fml", "-bf16", "-mve", "-mve.fp"});
+HasFPRegs = false;
   } else if (FPUKind == llvm::ARM::FK_NONE ||
  ArchArgFPUKind == llvm::ARM::FK_NONE ||
  CPUArgFPUKind == llvm::ARM::FK_NONE) {
@@ -652,9 +670,10 @@ void arm::getARMTargetFeatures(const Driver &D, const 
llvm::Triple &Triple,
 // latter, is still supported.
 Features.insert(Features.end(),
 {"-dotprod", "-fp16fml", "-bf16", "-mve.fp"});
-if (!hasIntegerMVE(Features))
-  Features.emplace_back("-fpregs");
+HasFPRegs = hasIntegerMVE(Features);
   }
+  if (!HasFPRegs)
+Features.emplace_back("-fpregs");
 
   // En/disable 

[clang] 47b431d - [NFC][Driver] Change MultilibBuilder interface

2023-06-06 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-07T05:53:04+01:00
New Revision: 47b431d6617d5029e30370ec988e5087f65e2d6b

URL: 
https://github.com/llvm/llvm-project/commit/47b431d6617d5029e30370ec988e5087f65e2d6b
DIFF: 
https://github.com/llvm/llvm-project/commit/47b431d6617d5029e30370ec988e5087f65e2d6b.diff

LOG: [NFC][Driver] Change MultilibBuilder interface

Decouple the interface of the MultilibBuilder flag method from how flags
are stored internally. Likewise change the addMultilibFlag function.

Currently a multilib flag like "-fexceptions" means a multilib is
*incompatible* with the -fexceptions command line option, which is
counter-intuitive. This change is a step towards changing this scheme.

Differential Revision: https://reviews.llvm.org/D151437

Added: 


Modified: 
clang/include/clang/Driver/MultilibBuilder.h
clang/lib/Driver/MultilibBuilder.cpp
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/CommonArgs.h
clang/lib/Driver/ToolChains/Fuchsia.cpp
clang/lib/Driver/ToolChains/Gnu.cpp
clang/lib/Driver/ToolChains/OHOS.cpp
clang/unittests/Driver/MultilibBuilderTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/MultilibBuilder.h 
b/clang/include/clang/Driver/MultilibBuilder.h
index f4875f2e03f8a..177c8104f917b 100644
--- a/clang/include/clang/Driver/MultilibBuilder.h
+++ b/clang/include/clang/Driver/MultilibBuilder.h
@@ -75,18 +75,9 @@ class MultilibBuilder {
   flags_list &flags() { return Flags; }
 
   /// Add a flag to the flags list
-  /// \p Flag must be a flag accepted by the driver with its leading '-'
-  /// removed,
-  /// and replaced with either:
-  ///   '-' which contraindicates using this multilib with that flag
-  /// or:
-  ///   '+' which promotes using this multilib in the presence of that flag
-  /// otherwise '-print-multi-lib' will not emit them correctly.
-  MultilibBuilder &flag(StringRef F) {
-assert(F.front() == '+' || F.front() == '-');
-Flags.push_back(std::string(F));
-return *this;
-  }
+  /// \p Required defines whether the flag is required or disallowed.
+  /// \p Flag must be a flag accepted by the driver.
+  MultilibBuilder &flag(bool Required, StringRef Flag);
 
   Multilib makeMultilib() const;
 

diff  --git a/clang/lib/Driver/MultilibBuilder.cpp 
b/clang/lib/Driver/MultilibBuilder.cpp
index f6351ae4b5278..213f971f262f7 100644
--- a/clang/lib/Driver/MultilibBuilder.cpp
+++ b/clang/lib/Driver/MultilibBuilder.cpp
@@ -7,6 +7,7 @@
 
//===--===//
 
 #include "clang/Driver/MultilibBuilder.h"
+#include "ToolChains/CommonArgs.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/Support/Path.h"
@@ -85,6 +86,11 @@ bool MultilibBuilder::isValid() const {
   return true;
 }
 
+MultilibBuilder &MultilibBuilder::flag(bool Required, StringRef Flag) {
+  tools::addMultilibFlag(Required, Flag, Flags);
+  return *this;
+}
+
 Multilib MultilibBuilder::makeMultilib() const {
   return Multilib(GCCSuffix, OSSuffix, IncludeSuffix, Flags);
 }

diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 3232394007bc3..6726ec1c9b22e 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -37,40 +37,42 @@ static bool findRISCVMultilibs(const Driver &D,
   StringRef Abi = tools::riscv::getRISCVABI(Args, TargetTriple);
 
   if (TargetTriple.isRISCV64()) {
-MultilibBuilder Imac =
-MultilibBuilder().flag("+march=rv64imac").flag("+mabi=lp64");
+MultilibBuilder Imac = MultilibBuilder()
+   .flag(true, "-march=rv64imac")
+   .flag(true, "-mabi=lp64");
 MultilibBuilder Imafdc = MultilibBuilder("/rv64imafdc/lp64d")
- .flag("+march=rv64imafdc")
- .flag("+mabi=lp64d");
+ .flag(true, "-march=rv64imafdc")
+ .flag(true, "-mabi=lp64d");
 
 // Multilib reuse
 bool UseImafdc =
 (Arch == "rv64imafdc") || (Arch == "rv64gc"); // gc => imafdc
 
-addMultilibFlag((Arch == "rv64imac"), "march=rv64imac", Flags);
-addMultilibFlag(UseImafdc, "march=rv64imafdc", Flags);
-addMultilibFlag(Abi == "lp64", "mabi=lp64", Flags);
-addMultilibFlag(Abi == "lp64d", "mabi=lp64d", Flags);
+addMultilibFlag((Arch == "rv64imac"), "-march=rv64imac", Flags);
+addMultilibFlag(UseImafdc, "-march=rv64imafdc", Flags);
+addMultilibFlag(Abi == "lp64", "-mabi=lp64", Flags);
+addMultilibFlag(Abi == "lp64d", "-mabi=lp64d", Flags);
 
 Result.Multilibs =
 MultilibSetBuilder().Either(Imac, Imafdc).makeMultilibSet();
 return Result.Multilibs.select(Flags, Result.Selec

[clang] ce8fa36 - [NFC][Driver] Change Multilib flag representation

2023-06-06 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-07T05:53:04+01:00
New Revision: ce8fa36e59e1995fde84730eeb460e06f42d7728

URL: 
https://github.com/llvm/llvm-project/commit/ce8fa36e59e1995fde84730eeb460e06f42d7728
DIFF: 
https://github.com/llvm/llvm-project/commit/ce8fa36e59e1995fde84730eeb460e06f42d7728.diff

LOG: [NFC][Driver] Change Multilib flag representation

This new representation means that a valid command line option may
potentially be used directly as a multilib flag without any translation.

To indicate that a flag is required not to be present, its first
character is replaced with '!', which is intended for consistency with
the logical not operator in many programming languages.

Reviewed By: simon_tatham

Differential Revision: https://reviews.llvm.org/D151438

Added: 


Modified: 
clang/include/clang/Driver/Multilib.h
clang/include/clang/Driver/MultilibBuilder.h
clang/lib/Driver/Multilib.cpp
clang/lib/Driver/MultilibBuilder.cpp
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/OHOS.cpp
clang/unittests/Driver/MultilibBuilderTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Multilib.h 
b/clang/include/clang/Driver/Multilib.h
index 9d6f1d23696b8..bf284e26f9dad 100644
--- a/clang/include/clang/Driver/Multilib.h
+++ b/clang/include/clang/Driver/Multilib.h
@@ -58,7 +58,7 @@ class Multilib {
   const std::string &includeSuffix() const { return IncludeSuffix; }
 
   /// Get the flags that indicate or contraindicate this multilib's use
-  /// All elements begin with either '+' or '-'
+  /// All elements begin with either '-' or '!'
   const flags_list &flags() const { return Flags; }
 
   LLVM_DUMP_METHOD void dump() const;

diff  --git a/clang/include/clang/Driver/MultilibBuilder.h 
b/clang/include/clang/Driver/MultilibBuilder.h
index 177c8104f917b..86f34592ba384 100644
--- a/clang/include/clang/Driver/MultilibBuilder.h
+++ b/clang/include/clang/Driver/MultilibBuilder.h
@@ -70,7 +70,7 @@ class MultilibBuilder {
   MultilibBuilder &includeSuffix(StringRef S);
 
   /// Get the flags that indicate or contraindicate this multilib's use
-  /// All elements begin with either '+' or '-'
+  /// All elements begin with either '-' or '!'
   const flags_list &flags() const { return Flags; }
   flags_list &flags() { return Flags; }
 

diff  --git a/clang/lib/Driver/Multilib.cpp b/clang/lib/Driver/Multilib.cpp
index 06bab74898616..5336c9ec57ec9 100644
--- a/clang/lib/Driver/Multilib.cpp
+++ b/clang/lib/Driver/Multilib.cpp
@@ -49,7 +49,7 @@ void Multilib::print(raw_ostream &OS) const {
   }
   OS << ";";
   for (StringRef Flag : Flags) {
-if (Flag.front() == '+')
+if (Flag.front() == '-')
   OS << "@" << Flag.substr(1);
   }
 }

diff  --git a/clang/lib/Driver/MultilibBuilder.cpp 
b/clang/lib/Driver/MultilibBuilder.cpp
index 213f971f262f7..d2a3fcb3732f6 100644
--- a/clang/lib/Driver/MultilibBuilder.cpp
+++ b/clang/lib/Driver/MultilibBuilder.cpp
@@ -76,7 +76,7 @@ bool MultilibBuilder::isValid() const {
 StringRef Flag(Flags[I]);
 llvm::StringMap::iterator SI = FlagSet.find(Flag.substr(1));
 
-assert(StringRef(Flag).front() == '+' || StringRef(Flag).front() == '-');
+assert(StringRef(Flag).front() == '-' || StringRef(Flag).front() == '!');
 
 if (SI == FlagSet.end())
   FlagSet[Flag.substr(1)] = I;
@@ -97,10 +97,10 @@ Multilib MultilibBuilder::makeMultilib() const {
 
 MultilibSetBuilder &MultilibSetBuilder::Maybe(const MultilibBuilder &M) {
   MultilibBuilder Opposite;
-  // Negate any '+' flags
+  // Negate positive flags
   for (StringRef Flag : M.flags()) {
-if (Flag.front() == '+')
-  Opposite.flags().push_back(("-" + Flag.substr(1)).str());
+if (Flag.front() == '-')
+  Opposite.flags().push_back(("!" + Flag.substr(1)).str());
   }
   return Either(M, Opposite);
 }

diff  --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 403b17d1b2d62..165b1f9ae1300 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1909,9 +1909,9 @@ void tools::addMultilibFlag(bool Enabled, const StringRef 
Flag,
 Multilib::flags_list &Flags) {
   assert(Flag.front() == '-');
   if (Enabled) {
-Flags.push_back(("+" + Flag.substr(1)).str());
-  } else {
 Flags.push_back(Flag.str());
+  } else {
+Flags.push_back(("!" + Flag.substr(1)).str());
   }
 }
 

diff  --git a/clang/lib/Driver/ToolChains/OHOS.cpp 
b/clang/lib/Driver/ToolChains/OHOS.cpp
index 833204e1dc535..0fdcafe898d70 100644
--- a/clang/lib/Driver/ToolChains/OHOS.cpp
+++ b/clang/lib/Driver/ToolChains/OHOS.cpp
@@ -40,15 +40,15 @@ static bool findOHOSMuslMultilibs(const 
Multilib::flags_list &Flags,
   // -mfloat-abi=soft -mfloat-abi=softfp -mfloat-abi=hard
   // -mfpu=neon-vfpv4
   Multilibs.push_back(
-  Multilib("/a7_soft", {}, {}, {"+mcpu=co

[clang] b4507dc - [NFC][Driver] Change MultilibBuilder flags argument order

2023-06-08 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-08T10:02:52+01:00
New Revision: b4507dcaeafcbd24ce793084d22d8189af685058

URL: 
https://github.com/llvm/llvm-project/commit/b4507dcaeafcbd24ce793084d22d8189af685058
DIFF: 
https://github.com/llvm/llvm-project/commit/b4507dcaeafcbd24ce793084d22d8189af685058.diff

LOG: [NFC][Driver] Change MultilibBuilder flags argument order

Follow up to D151437

Reviewed By: phosek

Differential Revision: https://reviews.llvm.org/D152353

Added: 


Modified: 
clang/include/clang/Driver/MultilibBuilder.h
clang/lib/Driver/MultilibBuilder.cpp
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/lib/Driver/ToolChains/Fuchsia.cpp
clang/lib/Driver/ToolChains/Gnu.cpp
clang/unittests/Driver/MultilibBuilderTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/MultilibBuilder.h 
b/clang/include/clang/Driver/MultilibBuilder.h
index 86f34592ba384..61596c5c573f3 100644
--- a/clang/include/clang/Driver/MultilibBuilder.h
+++ b/clang/include/clang/Driver/MultilibBuilder.h
@@ -75,9 +75,9 @@ class MultilibBuilder {
   flags_list &flags() { return Flags; }
 
   /// Add a flag to the flags list
-  /// \p Required defines whether the flag is required or disallowed.
   /// \p Flag must be a flag accepted by the driver.
-  MultilibBuilder &flag(bool Required, StringRef Flag);
+  /// \p Disallow defines whether the flag is negated and therefore disallowed.
+  MultilibBuilder &flag(StringRef Flag, bool Disallow = false);
 
   Multilib makeMultilib() const;
 

diff  --git a/clang/lib/Driver/MultilibBuilder.cpp 
b/clang/lib/Driver/MultilibBuilder.cpp
index d2a3fcb3732f6..15adf50177809 100644
--- a/clang/lib/Driver/MultilibBuilder.cpp
+++ b/clang/lib/Driver/MultilibBuilder.cpp
@@ -86,8 +86,8 @@ bool MultilibBuilder::isValid() const {
   return true;
 }
 
-MultilibBuilder &MultilibBuilder::flag(bool Required, StringRef Flag) {
-  tools::addMultilibFlag(Required, Flag, Flags);
+MultilibBuilder &MultilibBuilder::flag(StringRef Flag, bool Disallow) {
+  tools::addMultilibFlag(!Disallow, Flag, Flags);
   return *this;
 }
 
@@ -100,7 +100,7 @@ MultilibSetBuilder &MultilibSetBuilder::Maybe(const 
MultilibBuilder &M) {
   // Negate positive flags
   for (StringRef Flag : M.flags()) {
 if (Flag.front() == '-')
-  Opposite.flags().push_back(("!" + Flag.substr(1)).str());
+  Opposite.flag(Flag, /*Disallow=*/true);
   }
   return Either(M, Opposite);
 }

diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 6726ec1c9b22e..ec3571bb60ee8 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -37,12 +37,11 @@ static bool findRISCVMultilibs(const Driver &D,
   StringRef Abi = tools::riscv::getRISCVABI(Args, TargetTriple);
 
   if (TargetTriple.isRISCV64()) {
-MultilibBuilder Imac = MultilibBuilder()
-   .flag(true, "-march=rv64imac")
-   .flag(true, "-mabi=lp64");
+MultilibBuilder Imac =
+MultilibBuilder().flag("-march=rv64imac").flag("-mabi=lp64");
 MultilibBuilder Imafdc = MultilibBuilder("/rv64imafdc/lp64d")
- .flag(true, "-march=rv64imafdc")
- .flag(true, "-mabi=lp64d");
+ .flag("-march=rv64imafdc")
+ .flag("-mabi=lp64d");
 
 // Multilib reuse
 bool UseImafdc =
@@ -58,21 +57,20 @@ static bool findRISCVMultilibs(const Driver &D,
 return Result.Multilibs.select(Flags, Result.SelectedMultilib);
   }
   if (TargetTriple.isRISCV32()) {
-MultilibBuilder Imac = MultilibBuilder()
-   .flag(true, "-march=rv32imac")
-   .flag(true, "-mabi=ilp32");
+MultilibBuilder Imac =
+MultilibBuilder().flag("-march=rv32imac").flag("-mabi=ilp32");
 MultilibBuilder I = MultilibBuilder("/rv32i/ilp32")
-.flag(true, "-march=rv32i")
-.flag(true, "-mabi=ilp32");
+.flag("-march=rv32i")
+.flag("-mabi=ilp32");
 MultilibBuilder Im = MultilibBuilder("/rv32im/ilp32")
- .flag(true, "-march=rv32im")
- .flag(true, "-mabi=ilp32");
+ .flag("-march=rv32im")
+ .flag("-mabi=ilp32");
 MultilibBuilder Iac = MultilibBuilder("/rv32iac/ilp32")
-  .flag(true, "-march=rv32iac")
-  .flag(true, "-mabi=ilp32");
+  .flag("-march=rv32iac")
+  .flag("-mabi=ilp32");
 MultilibBuilder Imafc = MultilibBuilder("/rv32imafc/ilp32f")
-.flag(true, "-march=rv32imafc")
-  

[clang] 4794bda - [Driver] Multilib YAML parsing

2023-06-13 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-14T06:46:40+01:00
New Revision: 4794bdab7aed92e699db29e031bfe71f4005326f

URL: 
https://github.com/llvm/llvm-project/commit/4794bdab7aed92e699db29e031bfe71f4005326f
DIFF: 
https://github.com/llvm/llvm-project/commit/4794bdab7aed92e699db29e031bfe71f4005326f.diff

LOG: [Driver] Multilib YAML parsing

The format includes a ClangMinimumVersion entry to avoid a potential
source of subtle errors if an older version of Clang were to be used
with a multilib.yaml that requires a newer Clang to work correctly.
This feature is comparable to CMake's cmake_minimum_required.

Reviewed By: peter.smith

Differential Revision: https://reviews.llvm.org/D142932

Added: 


Modified: 
clang/include/clang/Driver/Multilib.h
clang/lib/Driver/Multilib.cpp
clang/unittests/Driver/MultilibTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Multilib.h 
b/clang/include/clang/Driver/Multilib.h
index bf284e26f9dad..493be70cfc35b 100644
--- a/clang/include/clang/Driver/Multilib.h
+++ b/clang/include/clang/Driver/Multilib.h
@@ -13,7 +13,9 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/StringSet.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/Support/SourceMgr.h"
 #include 
 #include 
 #include 
@@ -83,14 +85,25 @@ class MultilibSet {
   std::function(const Multilib &M)>;
   using FilterCallback = llvm::function_ref;
 
+  /// Uses regular expressions to simplify flags used for multilib selection.
+  /// For example, we may wish both -mfloat-abi=soft and -mfloat-abi=softfp to
+  /// be treated as -mfloat-abi=soft.
+  struct FlagMatcher {
+std::string Match;
+std::vector Flags;
+  };
+
 private:
   multilib_list Multilibs;
+  std::vector FlagMatchers;
   IncludeDirsFunc IncludeCallback;
   IncludeDirsFunc FilePathsCallback;
 
 public:
   MultilibSet() = default;
-  MultilibSet(multilib_list &&Multilibs) : Multilibs(Multilibs) {}
+  MultilibSet(multilib_list &&Multilibs,
+  std::vector &&FlagMatchers = {})
+  : Multilibs(Multilibs), FlagMatchers(FlagMatchers) {}
 
   const multilib_list &getMultilibs() { return Multilibs; }
 
@@ -111,6 +124,11 @@ class MultilibSet {
 
   unsigned size() const { return Multilibs.size(); }
 
+  /// Get the given flags plus flags found by matching them against the
+  /// FlagMatchers and choosing the Flags of each accordingly. The select 
method
+  /// calls this method so in most cases it's not necessary to call it 
directly.
+  llvm::StringSet<> expandFlags(const Multilib::flags_list &) const;
+
   LLVM_DUMP_METHOD void dump() const;
   void print(raw_ostream &OS) const;
 
@@ -127,6 +145,10 @@ class MultilibSet {
   }
 
   const IncludeDirsFunc &filePathsCallback() const { return FilePathsCallback; 
}
+
+  static llvm::ErrorOr
+  parseYaml(llvm::MemoryBufferRef, llvm::SourceMgr::DiagHandlerTy = nullptr,
+void *DiagHandlerCtxt = nullptr);
 };
 
 raw_ostream &operator<<(raw_ostream &OS, const MultilibSet &MS);

diff  --git a/clang/lib/Driver/Multilib.cpp b/clang/lib/Driver/Multilib.cpp
index 5336c9ec57ec9..0e988d040a4e3 100644
--- a/clang/lib/Driver/Multilib.cpp
+++ b/clang/lib/Driver/Multilib.cpp
@@ -8,14 +8,18 @@
 
 #include "clang/Driver/Multilib.h"
 #include "clang/Basic/LLVM.h"
+#include "clang/Basic/Version.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/StringSet.h"
 #include "llvm/Support/Compiler.h"
+#include "llvm/Support/Error.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Regex.h"
+#include "llvm/Support/VersionTuple.h"
+#include "llvm/Support/YAMLParser.h"
+#include "llvm/Support/YAMLTraits.h"
 #include "llvm/Support/raw_ostream.h"
 #include 
 #include 
@@ -91,10 +95,7 @@ void MultilibSet::push_back(const Multilib &M) { 
Multilibs.push_back(M); }
 
 MultilibSet::multilib_list
 MultilibSet::select(const Multilib::flags_list &Flags) const {
-  llvm::StringSet<> FlagSet;
-  for (const auto &Flag : Flags)
-FlagSet.insert(Flag);
-
+  llvm::StringSet<> FlagSet(expandFlags(Flags));
   multilib_list Result;
   llvm::copy_if(Multilibs, std::back_inserter(Result),
 [&FlagSet](const Multilib &M) {
@@ -115,6 +116,121 @@ bool MultilibSet::select(const Multilib::flags_list 
&Flags,
   return true;
 }
 
+llvm::StringSet<>
+MultilibSet::expandFlags(const Multilib::flags_list &InFlags) const {
+  llvm::StringSet<> Result;
+  for (const auto &F : InFlags)
+Result.insert(F);
+  for (const FlagMatcher &M : FlagMatchers) {
+std::string RegexString(M.Match);
+
+// Make the regular expression match the whole string.
+if (!StringRef(M.Match).starts_with("^"))
+  RegexString.insert(RegexString.begin(), '^');
+if (!StringRef(M.Match).ends_with("$"))
+  RegexString.push_back('$');
+
+

[clang] a794ab9 - [Driver] Add -print-multi-flags-experimental option

2023-06-13 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-14T06:46:41+01:00
New Revision: a794ab92b41f00ba29b5852c34a510173638dcc0

URL: 
https://github.com/llvm/llvm-project/commit/a794ab92b41f00ba29b5852c34a510173638dcc0
DIFF: 
https://github.com/llvm/llvm-project/commit/a794ab92b41f00ba29b5852c34a510173638dcc0.diff

LOG: [Driver] Add -print-multi-flags-experimental option

This option causes the flags used for selecting multilibs to be printed.
This is an experimental feature that is documented in detail in D143587.

Differential Revision: https://reviews.llvm.org/D142933

Added: 
clang/test/Driver/print-multi-selection-flags.c

Modified: 
clang/include/clang/Driver/Options.td
clang/include/clang/Driver/ToolChain.h
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/Arch/ARM.cpp
clang/lib/Driver/ToolChains/Arch/ARM.h

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 8f5db34551c07..cc6ee3c5d5c18 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -4330,6 +4330,8 @@ def print_libgcc_file_name : Flag<["-", "--"], 
"print-libgcc-file-name">,
"library (\"libgcc.a\" or \"libclang_rt.builtins.*.a\")">;
 def print_multi_directory : Flag<["-", "--"], "print-multi-directory">;
 def print_multi_lib : Flag<["-", "--"], "print-multi-lib">;
+def print_multi_flags : Flag<["-", "--"], "print-multi-flags-experimental">,
+  HelpText<"Print the flags used for selecting multilibs (experimental)">;
 def print_multi_os_directory : Flag<["-", "--"], "print-multi-os-directory">,
   Flags<[Unsupported]>;
 def print_target_triple : Flag<["-", "--"], "print-target-triple">,

diff  --git a/clang/include/clang/Driver/ToolChain.h 
b/clang/include/clang/Driver/ToolChain.h
index a4346a1bab8d2..3b3932f1e3432 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -285,6 +285,18 @@ class ToolChain {
 
   const Multilib &getMultilib() const { return SelectedMultilib; }
 
+  /// Get flags suitable for multilib selection, based on the provided clang
+  /// command line arguments. The command line arguments aren't suitable to be
+  /// used directly for multilib selection because they are not normalized and
+  /// normalization is a complex process. The result of this function is 
similar
+  /// to clang command line arguments except that the list of arguments is
+  /// incomplete. Only certain command line arguments are processed. If more
+  /// command line arguments are needed for multilib selection then this
+  /// function should be extended.
+  /// To allow users to find out what flags are returned, clang accepts a
+  /// -print-multi-flags-experimental argument.
+  Multilib::flags_list getMultilibFlags(const llvm::opt::ArgList &) const;
+
   SanitizerArgs getSanitizerArgs(const llvm::opt::ArgList &JobArgs) const;
 
   const XRayArgs& getXRayArgs() const;

diff  --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 243aebb3bc23f..87c31f993d758 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -2217,6 +2217,17 @@ bool Driver::HandleImmediateArgs(const Compilation &C) {
 return false;
   }
 
+  if (C.getArgs().hasArg(options::OPT_print_multi_flags)) {
+Multilib::flags_list ArgFlags = TC.getMultilibFlags(C.getArgs());
+llvm::StringSet<> ExpandedFlags = TC.getMultilibs().expandFlags(ArgFlags);
+std::set SortedFlags;
+for (const auto &FlagEntry : ExpandedFlags)
+  SortedFlags.insert(FlagEntry.getKey());
+for (auto Flag : SortedFlags)
+  llvm::outs() << Flag << '\n';
+return false;
+  }
+
   if (C.getArgs().hasArg(options::OPT_print_multi_directory)) {
 const Multilib &Multilib = TC.getMultilib();
 if (Multilib.gccSuffix().empty())

diff  --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index ccaebb384d4dc..9276b9a2ab85b 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -7,8 +7,10 @@
 
//===--===//
 
 #include "clang/Driver/ToolChain.h"
+#include "ToolChains/Arch/AArch64.h"
 #include "ToolChains/Arch/ARM.h"
 #include "ToolChains/Clang.h"
+#include "ToolChains/CommonArgs.h"
 #include "ToolChains/Flang.h"
 #include "ToolChains/InterfaceStubs.h"
 #include "clang/Basic/ObjCRuntime.h"
@@ -39,6 +41,7 @@
 #include "llvm/Support/Path.h"
 #include "llvm/Support/VersionTuple.h"
 #include "llvm/Support/VirtualFileSystem.h"
+#include "llvm/TargetParser/AArch64TargetParser.h"
 #include "llvm/TargetParser/TargetParser.h"
 #include "llvm/TargetParser/Triple.h"
 #include 
@@ -171,6 +174,101 @@ bool ToolChain::defaultToIEEELongDouble() const {
   return PPC_LINUX_DEFAULT_IEEELONGDOUBLE && getTriple().isOSLinux();
 }
 
+static void getAArch64MultilibFlags(co

[clang] b4eebc8 - [Driver] Enable multilib.yaml in the BareMetal ToolChain

2023-06-13 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-14T06:46:41+01:00
New Revision: b4eebc8674e1f1dc1ef08fa7648ca494a119449d

URL: 
https://github.com/llvm/llvm-project/commit/b4eebc8674e1f1dc1ef08fa7648ca494a119449d
DIFF: 
https://github.com/llvm/llvm-project/commit/b4eebc8674e1f1dc1ef08fa7648ca494a119449d.diff

LOG: [Driver] Enable multilib.yaml in the BareMetal ToolChain

The default location for multilib.yaml is lib/clang-runtimes, without
any target-specific suffix. This will allow multilibs for different
architectures to share a common include directory.

To avoid breaking the arm-execute-only.c CHECK-NO-EXECUTE-ONLY-ASM
test, add a ForMultilib argument to getARMTargetFeatures.

Since the presence of multilib.yaml can change the exact location of a
library, relax the baremetal.cpp test.

Differential Revision: https://reviews.llvm.org/D142986

Added: 
clang/test/Driver/baremetal-multilib.yaml

Modified: 
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/Arch/ARM.cpp
clang/lib/Driver/ToolChains/Arch/ARM.h
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/test/Driver/baremetal.cpp
clang/test/Driver/lit.local.cfg

Removed: 




diff  --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 9276b9a2ab85b..44b2a3d8f9d0b 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -199,8 +199,8 @@ static void getARMMultilibFlags(const Driver &D,
   const llvm::opt::ArgList &Args,
   Multilib::flags_list &Result) {
   std::vector Features;
-  llvm::ARM::FPUKind FPUKind =
-  tools::arm::getARMTargetFeatures(D, Triple, Args, Features, false);
+  llvm::ARM::FPUKind FPUKind = tools::arm::getARMTargetFeatures(
+  D, Triple, Args, Features, false /*ForAs*/, true /*ForMultilib*/);
   const auto UnifiedFeatures = tools::unifyTargetFeatures(Features);
   llvm::DenseSet FeatureSet(UnifiedFeatures.begin(),
UnifiedFeatures.end());

diff  --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp 
b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
index 62eee13664523..2ff18a47ef77a 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp
@@ -467,7 +467,7 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver 
&D,
  const llvm::Triple &Triple,
  const ArgList &Args,
  std::vector &Features,
- bool ForAS) {
+ bool ForAS, bool ForMultilib) {
   bool KernelOrKext =
   Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
   arm::FloatABI ABI = arm::getARMFloatABI(D, Triple, Args);
@@ -807,7 +807,9 @@ llvm::ARM::FPUKind arm::getARMTargetFeatures(const Driver 
&D,
 
   // Generate execute-only output (no data access to code sections).
   // This only makes sense for the compiler, not for the assembler.
-  if (!ForAS) {
+  // It's not needed for multilib selection and may hide an unused
+  // argument diagnostic if the code is always run.
+  if (!ForAS && !ForMultilib) {
 // Supported only on ARMv6T2 and ARMv7 and above.
 // Cannot be combined with -mno-movt.
 if (Arg *A = Args.getLastArg(options::OPT_mexecute_only, 
options::OPT_mno_execute_only)) {

diff  --git a/clang/lib/Driver/ToolChains/Arch/ARM.h 
b/clang/lib/Driver/ToolChains/Arch/ARM.h
index 0f18305579a2a..08696ad28931f 100644
--- a/clang/lib/Driver/ToolChains/Arch/ARM.h
+++ b/clang/lib/Driver/ToolChains/Arch/ARM.h
@@ -67,7 +67,7 @@ llvm::ARM::FPUKind getARMTargetFeatures(const Driver &D,
 const llvm::Triple &Triple,
 const llvm::opt::ArgList &Args,
 std::vector &Features,
-bool ForAS);
+bool ForAS, bool ForMultilib = false);
 int getARMSubArchVersionNumber(const llvm::Triple &Triple);
 bool isARMMProfile(const llvm::Triple &Triple);
 bool isARMAProfile(const llvm::Triple &Triple);

diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index ec3571bb60ee8..c167f8608945e 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -155,6 +155,46 @@ static bool isRISCVBareMetal(const llvm::Triple &Triple) {
   return Triple.getEnvironmentName() == "elf";
 }
 
+static bool findMultilibsFromYAML(const ToolChain &TC, const Driver &D,
+  StringRef MultilibPath, const ArgList &Args,
+  DetectedMultilibs &Result) {
+  llvm::ErrorOr> MB =
+  D.getVFS().getBufferForFile(MultilibPath);
+  i

[clang] edc1130 - [Driver] Enable selecting multiple multilibs

2023-06-13 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-14T06:46:41+01:00
New Revision: edc1130c0ac0e52ac5e347127972313ba928fe9a

URL: 
https://github.com/llvm/llvm-project/commit/edc1130c0ac0e52ac5e347127972313ba928fe9a
DIFF: 
https://github.com/llvm/llvm-project/commit/edc1130c0ac0e52ac5e347127972313ba928fe9a.diff

LOG: [Driver] Enable selecting multiple multilibs

This will enable layering multilibs on top of each other.
For example a multilib containing only a no-exceptions libc++ could be
layered on top of a multilib containing C libs. This avoids the need
to duplicate the C library for every libc++ variant.

This change doesn't expose the functionality externally, it only opens
the functionality up to be potentially used by ToolChain classes.

Differential Revision: https://reviews.llvm.org/D143059

Added: 


Modified: 
clang/include/clang/Driver/Multilib.h
clang/include/clang/Driver/ToolChain.h
clang/lib/Driver/Driver.cpp
clang/lib/Driver/Multilib.cpp
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/lib/Driver/ToolChains/CSKYToolChain.cpp
clang/lib/Driver/ToolChains/Fuchsia.cpp
clang/lib/Driver/ToolChains/Gnu.cpp
clang/lib/Driver/ToolChains/Gnu.h
clang/lib/Driver/ToolChains/Hexagon.cpp
clang/lib/Driver/ToolChains/Hurd.cpp
clang/lib/Driver/ToolChains/Linux.cpp
clang/lib/Driver/ToolChains/MipsLinux.cpp
clang/lib/Driver/ToolChains/OHOS.cpp
clang/lib/Driver/ToolChains/RISCVToolchain.cpp
clang/test/Driver/fuchsia.cpp
clang/unittests/Driver/MultilibBuilderTest.cpp
clang/unittests/Driver/MultilibTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Multilib.h 
b/clang/include/clang/Driver/Multilib.h
index 493be70cfc35b..1416559414f89 100644
--- a/clang/include/clang/Driver/Multilib.h
+++ b/clang/include/clang/Driver/Multilib.h
@@ -116,11 +116,9 @@ class MultilibSet {
   const_iterator begin() const { return Multilibs.begin(); }
   const_iterator end() const { return Multilibs.end(); }
 
-  /// Select compatible variants
-  multilib_list select(const Multilib::flags_list &Flags) const;
-
-  /// Pick the best multilib in the set, \returns false if none are compatible
-  bool select(const Multilib::flags_list &Flags, Multilib &M) const;
+  /// Select compatible variants, \returns false if none are compatible
+  bool select(const Multilib::flags_list &Flags,
+  llvm::SmallVector &) const;
 
   unsigned size() const { return Multilibs.size(); }
 

diff  --git a/clang/include/clang/Driver/ToolChain.h 
b/clang/include/clang/Driver/ToolChain.h
index 3b3932f1e3432..7b5c430aacc7e 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -187,7 +187,7 @@ class ToolChain {
 
 protected:
   MultilibSet Multilibs;
-  Multilib SelectedMultilib;
+  llvm::SmallVector SelectedMultilibs;
 
   ToolChain(const Driver &D, const llvm::Triple &T,
 const llvm::opt::ArgList &Args);
@@ -283,7 +283,9 @@ class ToolChain {
 
   const MultilibSet &getMultilibs() const { return Multilibs; }
 
-  const Multilib &getMultilib() const { return SelectedMultilib; }
+  const llvm::SmallVector &getSelectedMultilibs() const {
+return SelectedMultilibs;
+  }
 
   /// Get flags suitable for multilib selection, based on the provided clang
   /// command line arguments. The command line arguments aren't suitable to be

diff  --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 87c31f993d758..8f92606960b3a 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -2229,13 +2229,14 @@ bool Driver::HandleImmediateArgs(const Compilation &C) {
   }
 
   if (C.getArgs().hasArg(options::OPT_print_multi_directory)) {
-const Multilib &Multilib = TC.getMultilib();
-if (Multilib.gccSuffix().empty())
-  llvm::outs() << ".\n";
-else {
-  StringRef Suffix(Multilib.gccSuffix());
-  assert(Suffix.front() == '/');
-  llvm::outs() << Suffix.substr(1) << "\n";
+for (const Multilib &Multilib : TC.getSelectedMultilibs()) {
+  if (Multilib.gccSuffix().empty())
+llvm::outs() << ".\n";
+  else {
+StringRef Suffix(Multilib.gccSuffix());
+assert(Suffix.front() == '/');
+llvm::outs() << Suffix.substr(1) << "\n";
+  }
 }
 return false;
   }

diff  --git a/clang/lib/Driver/Multilib.cpp b/clang/lib/Driver/Multilib.cpp
index 0e988d040a4e3..a37dffc8a6f1d 100644
--- a/clang/lib/Driver/Multilib.cpp
+++ b/clang/lib/Driver/Multilib.cpp
@@ -93,27 +93,18 @@ MultilibSet &MultilibSet::FilterOut(FilterCallback F) {
 
 void MultilibSet::push_back(const Multilib &M) { Multilibs.push_back(M); }
 
-MultilibSet::multilib_list
-MultilibSet::select(const Multilib::flags_list &Flags) const {
+bool MultilibSet::select(const Multilib::flags_list &Flags,
+ llvm::SmallVector &Selected) const {
   llvm::S

[clang] ab2c80b - [Driver] BareMetal ToolChain multilib layering

2023-06-13 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-14T06:46:41+01:00
New Revision: ab2c80bb125634816e39a1e4787a5a103cd03a74

URL: 
https://github.com/llvm/llvm-project/commit/ab2c80bb125634816e39a1e4787a5a103cd03a74
DIFF: 
https://github.com/llvm/llvm-project/commit/ab2c80bb125634816e39a1e4787a5a103cd03a74.diff

LOG: [Driver] BareMetal ToolChain multilib layering

This enables layering baremetal multilibs on top of each other.
For example a multilib containing only a no-exceptions libc++ could be
layered on top of a multilib containing C libs. This avoids the need
to duplicate the C library for every libc++ variant.

Differential Revision: https://reviews.llvm.org/D143075

Added: 
clang/test/Driver/baremetal-multilib-layered.yaml

Modified: 
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/lib/Driver/ToolChains/BareMetal.h

Removed: 




diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 748f24e151aa5..17fd1f88975b9 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -103,9 +103,12 @@ BareMetal::BareMetal(const Driver &D, const llvm::Triple 
&Triple,
   findMultilibs(D, Triple, Args);
   SmallString<128> SysRoot(computeSysRoot());
   if (!SysRoot.empty()) {
-llvm::sys::path::append(SysRoot, "lib");
-getFilePaths().push_back(std::string(SysRoot));
-getLibraryPaths().push_back(std::string(SysRoot));
+for (const Multilib &M : getOrderedMultilibs()) {
+  SmallString<128> Dir(SysRoot);
+  llvm::sys::path::append(Dir, M.osSuffix(), "lib");
+  getFilePaths().push_back(std::string(Dir));
+  getLibraryPaths().push_back(std::string(Dir));
+}
   }
 }
 
@@ -222,10 +225,17 @@ Tool *BareMetal::buildLinker() const {
 }
 
 std::string BareMetal::computeSysRoot() const {
-  std::string Result = computeBaseSysRoot(getDriver(), getTriple());
+  return computeBaseSysRoot(getDriver(), getTriple());
+}
+
+BareMetal::OrderedMultilibs BareMetal::getOrderedMultilibs() const {
+  // Get multilibs in reverse order because they're ordered most-specific last.
   if (!SelectedMultilibs.empty())
-Result += SelectedMultilibs.back().osSuffix();
-  return Result;
+return llvm::reverse(SelectedMultilibs);
+
+  // No multilibs selected so return a single default multilib.
+  static const llvm::SmallVector Default = {Multilib()};
+  return llvm::reverse(Default);
 }
 
 void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
@@ -240,10 +250,14 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList 
&DriverArgs,
   }
 
   if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) {
-SmallString<128> Dir(computeSysRoot());
-if (!Dir.empty()) {
-  llvm::sys::path::append(Dir, "include");
-  addSystemInclude(DriverArgs, CC1Args, Dir.str());
+const SmallString<128> SysRoot(computeSysRoot());
+if (!SysRoot.empty()) {
+  for (const Multilib &M : getOrderedMultilibs()) {
+SmallString<128> Dir(SysRoot);
+llvm::sys::path::append(Dir, M.includeSuffix());
+llvm::sys::path::append(Dir, "include");
+addSystemInclude(DriverArgs, CC1Args, Dir.str());
+  }
 }
   }
 }
@@ -266,44 +280,47 @@ void BareMetal::AddClangCXXStdlibIncludeArgs(const 
ArgList &DriverArgs,
   if (SysRoot.empty())
 return;
 
-  switch (GetCXXStdlibType(DriverArgs)) {
-  case ToolChain::CST_Libcxx: {
-// First check sysroot/usr/include/c++/v1 if it exists.
-SmallString<128> TargetDir(SysRoot);
-llvm::sys::path::append(TargetDir, "usr", "include", "c++", "v1");
-if (D.getVFS().exists(TargetDir)) {
-  addSystemInclude(DriverArgs, CC1Args, TargetDir.str());
+  for (const Multilib &M : getOrderedMultilibs()) {
+SmallString<128> Dir(SysRoot);
+llvm::sys::path::append(Dir, M.gccSuffix());
+switch (GetCXXStdlibType(DriverArgs)) {
+case ToolChain::CST_Libcxx: {
+  // First check sysroot/usr/include/c++/v1 if it exists.
+  SmallString<128> TargetDir(Dir);
+  llvm::sys::path::append(TargetDir, "usr", "include", "c++", "v1");
+  if (D.getVFS().exists(TargetDir)) {
+addSystemInclude(DriverArgs, CC1Args, TargetDir.str());
+break;
+  }
+  // Add generic path if nothing else succeeded so far.
+  llvm::sys::path::append(Dir, "include", "c++", "v1");
+  addSystemInclude(DriverArgs, CC1Args, Dir.str());
+  break;
+}
+case ToolChain::CST_Libstdcxx: {
+  llvm::sys::path::append(Dir, "include", "c++");
+  std::error_code EC;
+  Generic_GCC::GCCVersion Version = {"", -1, -1, -1, "", "", ""};
+  // Walk the subdirs, and find the one with the newest gcc version:
+  for (llvm::vfs::directory_iterator
+   LI = D.getVFS().dir_begin(Dir.str(), EC),
+   LE;
+   !EC && LI != LE; LI = LI.increment(EC)) {
+StringRef VersionText = llvm::sys::path::filename(LI

[clang] a5aeba7 - [Docs] Multilib design

2023-06-13 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-14T06:46:42+01:00
New Revision: a5aeba737694f56daacfbe8f78601cbd14f5d359

URL: 
https://github.com/llvm/llvm-project/commit/a5aeba737694f56daacfbe8f78601cbd14f5d359
DIFF: 
https://github.com/llvm/llvm-project/commit/a5aeba737694f56daacfbe8f78601cbd14f5d359.diff

LOG: [Docs] Multilib design

Reviewed By: peter.smith, MaskRay

Differential Revision: https://reviews.llvm.org/D143587

Added: 
clang/docs/Multilib.rst

Modified: 
clang/docs/index.rst

Removed: 




diff  --git a/clang/docs/Multilib.rst b/clang/docs/Multilib.rst
new file mode 100644
index 0..78a300a60f8bc
--- /dev/null
+++ b/clang/docs/Multilib.rst
@@ -0,0 +1,311 @@
+
+Multilib
+
+
+Introduction
+
+
+This document describes how multilib is implemented in Clang.
+
+What is multilib and why might you care?
+If you're :doc:`cross compiling` then you can't use native
+system headers and libraries. To address this, you can use a combination of
+``--sysroot``, ``-isystem`` and ``-L`` options to point Clang at suitable
+directories for your target.
+However, when there are many possible directories to choose from, it's not
+necessarily obvious which one to pick.
+Multilib allows a toolchain designer to imbue the toolchain with the ability to
+pick a suitable directory automatically, based on the options the user provides
+to Clang. For example, if the user specifies
+``--target=arm-none-eabi -mcpu=cortex-m4`` the toolchain can choose a directory
+containing headers and libraries suitable for Armv7E-M, because it knows that's
+a suitable architecture for Arm Cortex-M4.
+Multilib can also choose between libraries for the same architecture based on
+other options. For example if the user specifies ``-fno-exceptions`` then a
+toolchain could select libraries built without exception support, thereby
+reducing the size of the resulting binary.
+
+Design
+==
+
+Clang supports GCC's ``-print-multi-lib`` and ``-print-multi-directory``
+options. These are described in
+`GCC Developer Options 
`_.
+
+There are two ways to configure multilib in Clang: hard-coded or via a
+configuration file.
+
+Hard-coded Multilib
+===
+
+The available libraries can be hard-coded in Clang. Typically this is done
+using the ``MultilibBuilder`` interface in
+``clang/include/clang/Driver/MultilibBuilder.h``.
+There are many examples of this in ``lib/Driver/ToolChains/Gnu.cpp``.
+The remainder of this document will not focus on this type of multilib.
+
+EXPERIMENTAL Multilib via configuration file
+
+
+Some Clang toolchains support loading multilib configuration from a
+``multilib.yaml`` configuration file.
+
+A ``multilib.yaml`` configuration file specifies which multilib variants are
+available, their relative location, what compilation options were used to build
+them, and the criteria by which they are selected.
+
+Multilib processing
+===
+
+Clang goes through the following steps to use multilib from a configuration
+file:
+#. Normalize command line options. Clang can accept the same
+   information via 
diff erent options - for example,
+   ``--target=arm-none-eabi -march=armv7-m`` and
+   ``--target=armv7m-none-eabi`` are equivalent.
+   Clang normalizes the command line before passing them to the multilib 
system.
+   To see what flags are emitted for a given set of command line options, use
+   the ``-print-multi-flags-experimental`` command line option
+   along with the rest of the options you want to use.
+#. Load ``multilib.yaml`` from sysroot.
+#. Generate additional flags. ``multilib.yaml`` contains a ``Mappings`` 
section,
+   which specifies how to generate additional flags based on the flags derived
+   from command line options. Flags are matched using regular expressions.
+   These regular expressions shall use the POSIX extended regular expression
+   syntax.
+#. Match flags against multilib variants. If the generated flags are a superset
+   of the flags specified for a multilib variant then the variant is considered
+   a match.
+   If more than one variant matches then a toolchain may opt to either use only
+   the *last* matching multilib variant, or may use all matching variants,
+   thereby :ref:`layering` them.
+#. Generate ``-isystem`` and ``-L`` options. Iterate in reverse order over
+   the matching multilib variants, and generate ``-isystem`` and ``-L``
+   options based on the multilib variant's directory.
+
+Multilib layering
+=
+
+When Clang selects multilib variants, it may find that more than one variant
+matches.
+
+It is up to the ToolChain subclass to decide what to do in this case.
+There are two options permitted:
+#. Use only the *last* matching multilib variant. This option exists primarily
+   for compatibilit

[clang] 01b6f06 - Fix test Driver/mips-mti-linux.c

2023-06-14 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-14T08:30:03+01:00
New Revision: 01b6f06263dd0a3db61c1bf0e6a3464c7cbd7ea2

URL: 
https://github.com/llvm/llvm-project/commit/01b6f06263dd0a3db61c1bf0e6a3464c7cbd7ea2
DIFF: 
https://github.com/llvm/llvm-project/commit/01b6f06263dd0a3db61c1bf0e6a3464c7cbd7ea2.diff

LOG: Fix test Driver/mips-mti-linux.c

Added: 


Modified: 
clang/lib/Driver/ToolChains/MipsLinux.cpp
clang/lib/Driver/ToolChains/MipsLinux.h

Removed: 




diff  --git a/clang/lib/Driver/ToolChains/MipsLinux.cpp 
b/clang/lib/Driver/ToolChains/MipsLinux.cpp
index 6157970233ae5..eacdcbf730b62 100644
--- a/clang/lib/Driver/ToolChains/MipsLinux.cpp
+++ b/clang/lib/Driver/ToolChains/MipsLinux.cpp
@@ -56,7 +56,7 @@ void MipsLLVMToolChain::AddClangSystemIncludeArgs(
 
   const auto &Callback = Multilibs.includeDirsCallback();
   if (Callback) {
-for (const auto &Path : Callback(SelectedMultilib))
+for (const auto &Path : Callback(SelectedMultilibs.back()))
   addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
   D.getInstalledDir() + Path);
   }
@@ -68,11 +68,11 @@ Tool *MipsLLVMToolChain::buildLinker() const {
 
 std::string MipsLLVMToolChain::computeSysRoot() const {
   if (!getDriver().SysRoot.empty())
-return getDriver().SysRoot + SelectedMultilib.osSuffix();
+return getDriver().SysRoot + SelectedMultilibs.back().osSuffix();
 
   const std::string InstalledDir(getDriver().getInstalledDir());
   std::string SysRootPath =
-  InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
+  InstalledDir + "/../sysroot" + SelectedMultilibs.back().osSuffix();
   if (llvm::sys::fs::exists(SysRootPath))
 return SysRootPath;
 
@@ -96,7 +96,7 @@ void MipsLLVMToolChain::addLibCxxIncludePaths(
 const llvm::opt::ArgList &DriverArgs,
 llvm::opt::ArgStringList &CC1Args) const {
   if (const auto &Callback = Multilibs.includeDirsCallback()) {
-for (std::string Path : Callback(SelectedMultilib)) {
+for (std::string Path : Callback(SelectedMultilibs.back())) {
   Path = getDriver().getInstalledDir() + Path + "/c++/v1";
   if (llvm::sys::fs::exists(Path)) {
 addSystemInclude(DriverArgs, CC1Args, Path);
@@ -122,7 +122,7 @@ std::string MipsLLVMToolChain::getCompilerRT(const ArgList 
&Args,
  StringRef Component,
  FileType Type) const {
   SmallString<128> Path(getDriver().ResourceDir);
-  llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
+  llvm::sys::path::append(Path, SelectedMultilibs.back().osSuffix(), "lib" + 
LibSuffix,
   getOS());
   const char *Suffix;
   switch (Type) {

diff  --git a/clang/lib/Driver/ToolChains/MipsLinux.h 
b/clang/lib/Driver/ToolChains/MipsLinux.h
index 31b547c0063ca..a968804f2a6ec 100644
--- a/clang/lib/Driver/ToolChains/MipsLinux.h
+++ b/clang/lib/Driver/ToolChains/MipsLinux.h
@@ -53,7 +53,6 @@ class LLVM_LIBRARY_VISIBILITY MipsLLVMToolChain : public 
Linux {
   }
 
 private:
-  Multilib SelectedMultilib;
   std::string LibSuffix;
 };
 



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] 620d2bf - [clang] Allow using BareMetal toolchain with LLVM_ENABLE_PER_TARGET_RUNTIME_DIR compiler-rt

2022-12-12 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2022-12-12T15:36:06Z
New Revision: 620d2bfdadeb7f4936775422a0e965e7fcdcd204

URL: 
https://github.com/llvm/llvm-project/commit/620d2bfdadeb7f4936775422a0e965e7fcdcd204
DIFF: 
https://github.com/llvm/llvm-project/commit/620d2bfdadeb7f4936775422a0e965e7fcdcd204.diff

LOG: [clang] Allow using BareMetal toolchain with 
LLVM_ENABLE_PER_TARGET_RUNTIME_DIR compiler-rt

If you build compiler-rt with LLVM_ENABLE_PER_TARGET_RUNTIME_DIR then
the library filename will be "libclang_rt.builtins.a" instead of
"libclang_rt.builtins-.a"

The ToolChain::getCompilerRT method uses the "libclang_rt.builtins.a"
name if it can find the file in the library directories. If it can't
then it falls back to using "libclang_rt.builtins-.a". This
change adds the library directory such that "libclang_rt.builtins.a"
can be found.

Differential Revision: https://reviews.llvm.org/D139822

Added: 


Modified: 
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/test/Driver/baremetal.cpp

Removed: 




diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 135843463b00b..ac9c7036ad6ef 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -103,6 +103,7 @@ BareMetal::BareMetal(const Driver &D, const llvm::Triple 
&Triple,
   if (!SysRoot.empty()) {
 llvm::sys::path::append(SysRoot, "lib");
 getFilePaths().push_back(std::string(SysRoot));
+getLibraryPaths().push_back(std::string(SysRoot));
   }
 }
 

diff  --git a/clang/test/Driver/baremetal.cpp b/clang/test/Driver/baremetal.cpp
index b5fc45586908d..24890e87c313c 100644
--- a/clang/test/Driver/baremetal.cpp
+++ b/clang/test/Driver/baremetal.cpp
@@ -340,3 +340,27 @@
 // CHECK-RV32IMAFC-NEXT: ld{{(.exe)?}}" "{{.*}}.o" "-Bstatic"
 // CHECK-RV32IMAFC-SAME: 
"-L[[SYSROOT:[^"]+]]{{[/\\]+}}rv32imafc{{[/\\]+}}ilp32f{{[/\\]+}}lib"
 // CHECK-RV32IMAFC-SAME: 
"-L[[RESOURCE_DIR:[^"]+]]{{[/\\]+}}lib{{[/\\]+}}baremetal{{[/\\]+}}rv32imafc{{[/\\]+}}ilp32f"
+
+// Check that compiler-rt library without the arch filename suffix will
+// be used if present.
+// RUN: rm -rf %T/baremetal_clang_rt_noarch
+// RUN: mkdir -p %T/baremetal_clang_rt_noarch/lib
+// RUN: touch %T/baremetal_clang_rt_noarch/lib/libclang_rt.builtins.a
+// RUN: %clang %s -### 2>&1 \
+// RUN: --target=armv6m-none-eabi \
+// RUN: --sysroot=%T/baremetal_clang_rt_noarch \
+// RUN:   | FileCheck --check-prefix=CHECK-CLANGRT-NOARCH %s
+// CHECK-CLANGRT-NOARCH: "-lclang_rt.builtins"
+// CHECK-CLANGRT-NOARCH-NOT: "-lclang_rt.builtins-armv6m"
+
+// Check that compiler-rt library with the arch filename suffix will be
+// used if present.
+// RUN: rm -rf %T/baremetal_clang_rt_arch
+// RUN: mkdir -p %T/baremetal_clang_rt_arch/lib
+// RUN: touch %T/baremetal_clang_rt_arch/lib/libclang_rt.builtins-armv6m.a
+// RUN: %clang %s -### 2>&1 \
+// RUN: --target=armv6m-none-eabi \
+// RUN: --sysroot=%T/baremetal_clang_rt_arch \
+// RUN:   | FileCheck --check-prefix=CHECK-CLANGRT-ARCH %s
+// CHECK-CLANGRT-ARCH: "-lclang_rt.builtins-armv6m"
+// CHECK-CLANGRT-ARCH-NOT: "-lclang_rt.builtins"



___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)

2024-02-15 Thread Michael Platings via cfe-commits
Dominik =?utf-8?q?Wójt?= 
Message-ID:
In-Reply-To: 


https://github.com/mplatings edited 
https://github.com/llvm/llvm-project/pull/81474
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)

2024-02-15 Thread Michael Platings via cfe-commits
Dominik =?utf-8?q?Wójt?= 
Message-ID:
In-Reply-To: 



@@ -191,7 +191,11 @@ static void getAArch64MultilibFlags(const Driver &D,
   for (const auto &Ext : AArch64::Extensions)
 if (FeatureSet.contains(Ext.NegFeature))
   MArch.push_back(("no" + Ext.Name).str());
-  MArch.insert(MArch.begin(), ("-march=" + Triple.getArchName()).str());
+  StringRef ArchName;
+  for (const auto &ArchInfo : AArch64::ArchInfos)
+if (FeatureSet.contains(ArchInfo->ArchFeature))
+  ArchName = ArchInfo->Name;

mplatings wrote:

What happens if no match is found? What happens if multiple matches are found? 
I suggest some error checking is needed here, even if it's just asserts.

https://github.com/llvm/llvm-project/pull/81474
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)

2024-02-15 Thread Michael Platings via cfe-commits
Dominik =?utf-8?q?W=C3=B3jt?= 
Message-ID:
In-Reply-To: 


https://github.com/mplatings requested changes to this pull request.

Definitely an improvement, thanks.

https://github.com/llvm/llvm-project/pull/81474
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][AArch64] multilib: fix deduction of "-march=" option (PR #81474)

2024-02-15 Thread Michael Platings via cfe-commits
Dominik =?utf-8?q?W=C3=B3jt?= ,
Dominik =?utf-8?q?W=C3=B3jt?= 
Message-ID:
In-Reply-To: 


https://github.com/mplatings approved this pull request.


https://github.com/llvm/llvm-project/pull/81474
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits