Skip to content

Conversation

@mikecrowe
Copy link
Contributor

The fix in e9ddc44 wasn't enough for multilib targets since they use a custom vendor that contains the multilib variant. There are two common multilib variants: lib32 and libx32, so let's support both.

@llvmbot llvmbot added clang Clang issues not falling into any other category clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' labels Dec 29, 2024
@llvmbot
Copy link
Member

llvmbot commented Dec 29, 2024

@llvm/pr-subscribers-clang-driver

@llvm/pr-subscribers-clang

Author: Mike Crowe (mikecrowe)

Changes

The fix in e9ddc44 wasn't enough for multilib targets since they use a custom vendor that contains the multilib variant. There are two common multilib variants: lib32 and libx32, so let's support both.


Full diff: https://github.com/llvm/llvm-project/pull/121302.diff

16 Files Affected:

  • (added) clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/include/c++/9.5.0/backward/.keep ()
  • (added) clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/crtbegin.o ()
  • (added) clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/crtend.o ()
  • (added) clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crt1.o ()
  • (added) clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crti.o ()
  • (added) clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crtn.o ()
  • (added) clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/include/c++/14.2.0/backward/.keep ()
  • (added) clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crt1.o ()
  • (added) clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crti.o ()
  • (added) clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crtn.o ()
  • (added) clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/crtbegin.o ()
  • (added) clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/crtend.o ()
  • (modified) clang/test/Driver/linux-header-search.cpp (+22)
  • (modified) clang/test/Driver/linux-ld.c (+36)
  • (modified) llvm/lib/TargetParser/Triple.cpp (+2)
  • (modified) llvm/unittests/TargetParser/TripleTest.cpp (+12)
diff --git a/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/include/c++/9.5.0/backward/.keep b/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/include/c++/9.5.0/backward/.keep
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/crtbegin.o b/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/crtbegin.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/crtend.o b/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/crtend.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crt1.o b/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crt1.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crti.o b/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crti.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crtn.o b/clang/test/Driver/Inputs/openembedded_arm_multilib_lib32_linux_tree/usr/lib/crtn.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/include/c++/14.2.0/backward/.keep b/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/include/c++/14.2.0/backward/.keep
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crt1.o b/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crt1.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crti.o b/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crti.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crtn.o b/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/crtn.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/crtbegin.o b/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/crtbegin.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/crtend.o b/clang/test/Driver/Inputs/openembedded_x86_64_multilib_libx32_linux_tree/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/crtend.o
new file mode 100644
index 00000000000000..e69de29bb2d1d6
diff --git a/clang/test/Driver/linux-header-search.cpp b/clang/test/Driver/linux-header-search.cpp
index 70a85deac89e40..8ec84e1e93d2c1 100644
--- a/clang/test/Driver/linux-header-search.cpp
+++ b/clang/test/Driver/linux-header-search.cpp
@@ -309,6 +309,28 @@
 // CHECK-OE-AARCH64: "-internal-isystem" "[[SYSROOT]]/usr/lib64/aarch64-oe-linux/6.3.0/../../../include/c++/6.3.0"
 // CHECK-OE-AARCH64: "-internal-isystem" "[[SYSROOT]]/usr/lib64/aarch64-oe-linux/6.3.0/../../../include/c++/6.3.0/backward"
 
+// Check header search on OpenEmbedded multilib lib32.
+// RUN: %clang -### %s -fsyntax-only 2>&1 \
+// RUN:     --target=arm-oemllib32-linux-gnueabi -stdlib=libstdc++ \
+// RUN:     --sysroot=%S/Inputs/openembedded_arm_multilib_lib32_linux_tree \
+// RUN:   | FileCheck --check-prefix=CHECK-OE-ARM-MULTILIB-LIB32 %s
+
+// CHECK-OE-ARM-MULTILIB-LIB32: "-cc1"
+// CHECK-OE-ARM-MULTILIB-LIB32: "-isysroot" "[[SYSROOT:[^"]+]]"
+// CHECK-OE-ARM-MULTILIB-LIB32: "-internal-isystem" "[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/../../../include/c++/9.5.0"
+// CHECK-OE-ARM-MULTILIB-LIB32: "-internal-isystem" "[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/../../../include/c++/9.5.0/backward"
+
+// Check header search on OpenEmbedded multilib libx32.
+// RUN: %clang -### %s -fsyntax-only 2>&1 \
+// RUN:     --target=x86_64-oemllibx32-linux-gnux32 -stdlib=libstdc++ \
+// RUN:     --sysroot=%S/Inputs/openembedded_x86_64_multilib_libx32_linux_tree \
+// RUN:   | FileCheck --check-prefix=CHECK-OE-X86_64-MULTILIB-LIBX32 %s
+
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-cc1"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-isysroot" "[[SYSROOT:[^"]+]]"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-internal-isystem" "[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/../../../include/c++/14.2.0"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-internal-isystem" "[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/../../../include/c++/14.2.0/backward"
+
 // Check header search with Cray's gcc package.
 // RUN: %clang -### %s -fsyntax-only 2>&1 \
 // RUN:     --target=x86_64-unknown-linux-gnu -stdlib=libstdc++ \
diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c
index 4d641c8f1b46e9..bd033b26a77e75 100644
--- a/clang/test/Driver/linux-ld.c
+++ b/clang/test/Driver/linux-ld.c
@@ -1789,6 +1789,42 @@
 // CHECK-OE-AARCH64: "[[SYSROOT]]/usr/lib64/aarch64-oe-linux/6.3.0{{/|\\\\}}crtend.o"
 // CHECK-OE-AARCH64: "[[SYSROOT]]/usr/lib64/aarch64-oe-linux/6.3.0/../../../lib64{{/|\\\\}}crtn.o"
 
+// Check whether the OpenEmbedded ARM multilib lib32 libs are added correctly.
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN:     --target=arm-oemllib32-linux-gnueabi -rtlib=libgcc --unwindlib=platform \
+// RUN:     --sysroot=%S/Inputs/openembedded_arm_multilib_lib32_linux_tree \
+// RUN:   | FileCheck --check-prefix=CHECK-OE-ARM-MULTILIB-LIB32 %s
+
+// CHECK-OE-ARM-MULTILIB-LIB32: "-cc1" "-triple" "armv4t-oemllib32-linux-gnueabi"
+// CHECK-OE-ARM-MULTILIB-LIB32: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-OE-ARM-MULTILIB-LIB32: "-m" "armelf_linux_eabi" "-dynamic-linker"
+// CHECK-OE-ARM-MULTILIB-LIB32: "[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/../../../lib{{/|\\\\}}crt1.o"
+// CHECK-OE-ARM-MULTILIB-LIB32: "[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/../../../lib{{/|\\\\}}crti.o"
+// CHECK-OE-ARM-MULTILIB-LIB32: "[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0{{/|\\\\}}crtbegin.o"
+// CHECK-OE-ARM-MULTILIB-LIB32: "-L[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0"
+// CHECK-OE-ARM-MULTILIB-LIB32: "-L[[SYSROOT]]/usr/lib"
+// CHECK-OE-ARM-MULTILIB-LIB32: "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed"
+// CHECK-OE-ARM-MULTILIB-LIB32: "[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0{{/|\\\\}}crtend.o"
+// CHECK-OE-ARM-MULTILIB-LIB32: "[[SYSROOT]]/usr/lib/arm-oemllib32-linux-gnueabi/9.5.0/../../../lib{{/|\\\\}}crtn.o"
+
+// Check whether the OpenEmbedded x86_64 multilib libx32 libs are added correctly.
+// RUN: %clang -### %s -no-pie 2>&1 \
+// RUN:     --target=x86_64-oemllibx32-linux-gnux32 -rtlib=libgcc --unwindlib=platform \
+// RUN:     --sysroot=%S/Inputs/openembedded_x86_64_multilib_libx32_linux_tree \
+// RUN:   | FileCheck --check-prefix=CHECK-OE-X86_64-MULTILIB-LIBX32 %s
+
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-cc1" "-triple" "x86_64-oemllibx32-linux-gnux32"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: ld{{.*}}" "--sysroot=[[SYSROOT:[^"]+]]"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-m" "elf32_x86_64" "-dynamic-linker"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/../../../libx32{{/|\\\\}}crt1.o"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/../../../libx32{{/|\\\\}}crti.o"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0{{/|\\\\}}crtbegin.o"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-L[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-L[[SYSROOT]]/usr/libx32"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0{{/|\\\\}}crtend.o"
+// CHECK-OE-X86_64-MULTILIB-LIBX32: "[[SYSROOT]]/usr/libx32/x86_64-oemllibx32-linux-gnux32/14.2.0/../../../libx32{{/|\\\\}}crtn.o"
+
 /// -nopie is OpenBSD-specific.
 // RUN: not %clang -### --target=x86_64-unknown-linux-gnu %s -nopie 2>&1 | FileCheck %s --check-prefix=CHECK-NOPIE
 // CHECK-NOPIE: error: unsupported option '-nopie' for target 'x86_64-unknown-linux-gnu'
diff --git a/llvm/lib/TargetParser/Triple.cpp b/llvm/lib/TargetParser/Triple.cpp
index 7e040688dc1a7b..1e74b918b6ce80 100644
--- a/llvm/lib/TargetParser/Triple.cpp
+++ b/llvm/lib/TargetParser/Triple.cpp
@@ -643,6 +643,8 @@ static Triple::VendorType parseVendor(StringRef VendorName) {
       .Case("mesa", Triple::Mesa)
       .Case("suse", Triple::SUSE)
       .Case("oe", Triple::OpenEmbedded)
+      .Case("oemllib32", Triple::OpenEmbedded)
+      .Case("oemllibx32", Triple::OpenEmbedded)
       .Case("intel", Triple::Intel)
       .Default(Triple::UnknownVendor);
 }
diff --git a/llvm/unittests/TargetParser/TripleTest.cpp b/llvm/unittests/TargetParser/TripleTest.cpp
index 7fb7625f8c2d10..d4ee9b0f2bbd32 100644
--- a/llvm/unittests/TargetParser/TripleTest.cpp
+++ b/llvm/unittests/TargetParser/TripleTest.cpp
@@ -1075,6 +1075,18 @@ TEST(TripleTest, ParsedIDs) {
   EXPECT_EQ(Triple::Linux, T.getOS());
   EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
 
+  T = Triple("arm-oemllib32-linux-gnueabi");
+  EXPECT_EQ(Triple::arm, T.getArch());
+  EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUEABI, T.getEnvironment());
+
+  T = Triple("x86_64-oemllibx32-linux-gnux32");
+  EXPECT_EQ(Triple::x86_64, T.getArch());
+  EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUX32, T.getEnvironment());
+
   T = Triple("aarch64-oe-linux");
   EXPECT_EQ(Triple::aarch64, T.getArch());
   EXPECT_EQ(Triple::OpenEmbedded, T.getVendor());

@mikecrowe
Copy link
Contributor Author

This works, but I'm not sure that it's the best solution. I could teach parseVendor to match a prefix of oeml rather than hard-coding the two specific multilib types.

The fix in e9ddc44 wasn't enough for
multilib targets since they use a custom vendor that contains the
multilib variant.  There are two common multilib variants: lib32 and
libx32, so let's support both.
@mikecrowe
Copy link
Contributor Author

@nikic @MaskRay Ping

@MaskRay
Copy link
Member

MaskRay commented Feb 23, 2025

The include and library path code in the driver needs more love. I have cleaned up some a few years ago but there is still quite a bit tech debt.

In particular, the 2018 commit you mentioned (https://reviews.llvm.org/D48862) introduced

  if (Triple.getVendor() == llvm::Triple::OpenEmbedded &&
      Triple.isArch64Bit())
    addPathIfExists(D, SysRoot + "/usr/" + OSLibDir, Paths);
  else
    addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);

which could be simplified to /usr/ + OSLibDir, and the latter /usr/lib could be removed if OSLibDir is "lib".
I am testing #128428 and will push it when the Windows tests pass (it's annoying but Windows uses \, making a lot of tests ugly..)


A lot of ELF-specific Triple::VendorType should not have been added in the first place.

Can you confirm whether you added new OpenEmbedded VendorType due to the following customization?
This is an unfortunate special case and I hope that OpenEmbedded moves away from the difference. Just pick gcc/ or gcc-cross/ or install symlinks so that Clang doesn't need to more probing.
It does not scale if there are similar projects like OpenEmbedded that do a similar thing and want to add a new VendorType to LLVM just to make their upstream divergent customization working.

      // This is the normal place.
      {"gcc/" + CandidateTriple.str(), "../..", GCCDirExists},

      // Debian puts cross-compilers in gcc-cross.
      {"gcc-cross/" + CandidateTriple.str(), "../..", GCCCrossDirExists},

      // The Freescale PPC SDK has the gcc libraries in
      // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well. Only do
      // this on Freescale triples, though, since some systems put a *lot* of
      // files in that location, not just GCC installation data.
      {CandidateTriple.str(), "..",
       TargetTriple.getVendor() == llvm::Triple::Freescale ||
           TargetTriple.getVendor() == llvm::Triple::OpenEmbedded}};

@mikecrowe
Copy link
Contributor Author

mikecrowe commented Feb 26, 2025

Thank you for investigating this. Your change in #128428 certainly makes things look a lot neater to me. I believe that OpenEmbedded multilib is relying on the same llvm::Triple::OpenEmbedded workaround added in https://reviews.llvm.org/D48862.

I rebased this change on top of current main and the tests I added still need the new cases I added to Triple.cpp as would be expected.

I can certainly try asking on the OpenEmbedded lists whether they'd be willing to try to use the more-standard locations. I suspect that they made their decision a very long time ago when the conventions hadn't been settled. The way embedded development is, even if they do agree to change it there will be many users still using older versions of OpenEmbedded without the change for many years to come.

Even with this change things aren't perfect since clangd appears to still be reporting paths in /usr/include even when compile_commands.json contains --sysroot= pointing elsewhere but that's presumably a different problem. :(

@mikecrowe
Copy link
Contributor Author

I tried asking about this on the OpenEmbedded mailing list. The response was that it has been this way for so long that it's going to be a major undertaking to change it even though they would quite like to do so.

I had a go at using symlinks to work around the problem. Unfortunately because ScanLibDirForGCCTriple ends up using ../../.. to turn /usr/lib/gcc/${TARGET_SYS}/${gccversion} (where ${TARGET_SYS} is the triple) back into just /usr/lib it's necessary to have real directories for each of those components and only have symlinks below that. In other words:

mkdir -p $sysroot/usr/lib/gcc/arm-oemllib32-linux-gnueabi/9.5.0
cd $sysroot/usr/lib/gcc/arm-oemllib32-linux-gnueabi/9.5.0
ln -s ln -s ../../../arm-oemllib32-linux-gnueabi/9.5.0/* .

Presumably there's a reason that ../../.. (made up of the ReversePath in the Suffixes array and another /../ when constructing GCCParentLibPath) is used rather than removing components from the path or just using the --sysroot path to find /usr/lib?

@MaskRay
Copy link
Member

MaskRay commented Mar 23, 2025

I tried asking about this on the OpenEmbedded mailing list. The response was that it has been this way for so long that it's going to be a major undertaking to change it even though they would quite like to do so.

I had a go at using symlinks to work around the problem. Unfortunately because ScanLibDirForGCCTriple ends up using ../../.. to turn /usr/lib/gcc/${TARGET_SYS}/${gccversion} (where ${TARGET_SYS} is the triple) back into just /usr/lib it's necessary to have real directories for each of those components and only have symlinks below that. In other words:

mkdir -p $sysroot/usr/lib/gcc/arm-oemllib32-linux-gnueabi/9.5.0
cd $sysroot/usr/lib/gcc/arm-oemllib32-linux-gnueabi/9.5.0
ln -s ln -s ../../../arm-oemllib32-linux-gnueabi/9.5.0/* .

Presumably there's a reason that ../../.. (made up of the ReversePath in the Suffixes array and another /../ when constructing GCCParentLibPath) is used rather than removing components from the path or just using the --sysroot path to find /usr/lib?

Thank you for asking OpenEmbedded.
clangDriver works with many toolchains. The issue is that if each one require its own special handling in the code, it will add up, and it's definitely not a scalable solution...
Ideally, the GCC code would introduce symlinks, eliminating the need for clangDriver to handle these variations. This would prevent situations where clangDriver cleanup requires OpenEmbedded users to manually verify potential breakages.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang Clang issues not falling into any other category

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants