[llvm] [llvm][MC] Fix missing SubArch information when calling lookupTarget (PR #69902)

via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 23 01:08:01 PDT 2023


https://github.com/huaatian created https://github.com/llvm/llvm-project/pull/69902

When calling the function 'lookupTarget', in some cases, the SubArch information of the parameter TheTriple gets lost. This modification ensures the integrity of the parameter TheTriple.

>From 2be83718e0faf4c1e48f71b3f20b32f028338188 Mon Sep 17 00:00:00 2001
From: huaatian <huaatian at sina.com>
Date: Mon, 23 Oct 2023 15:36:49 +0800
Subject: [PATCH] [llvm][MC] Fix missing SubArch information when calling
 lookupTarget

When calling the function 'lookupTarget', in some cases, the SubArch information of
the parameter TheTriple gets lost. This modification ensures the integrity
of the parameter TheTriple.
---
 llvm/lib/MC/TargetRegistry.cpp       |  3 ++-
 llvm/unittests/MC/TargetRegistry.cpp | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/MC/TargetRegistry.cpp b/llvm/lib/MC/TargetRegistry.cpp
index fa7aaccabcd6109..bfce3f9d4e5b363 100644
--- a/llvm/lib/MC/TargetRegistry.cpp
+++ b/llvm/lib/MC/TargetRegistry.cpp
@@ -43,7 +43,8 @@ const Target *TargetRegistry::lookupTarget(StringRef ArchName,
     // given triple.
     Triple::ArchType Type = Triple::getArchTypeForLLVMName(ArchName);
     if (Type != Triple::UnknownArch)
-      TheTriple.setArch(Type);
+      // Set the type of Arch while preserving SubArch, if any.
+      TheTriple.setArch(Type, TheTriple.getSubArch());
   } else {
     // Get the target specific parser.
     std::string TempError;
diff --git a/llvm/unittests/MC/TargetRegistry.cpp b/llvm/unittests/MC/TargetRegistry.cpp
index cc464b7681ce17e..924a55add874697 100644
--- a/llvm/unittests/MC/TargetRegistry.cpp
+++ b/llvm/unittests/MC/TargetRegistry.cpp
@@ -42,4 +42,22 @@ TEST(TargetRegistry, TargetHasArchType) {
   ASSERT_NE(Count, 0);
 }
 
+TEST(TargetRegistry, PreserveSubArchInfo) {
+  auto T = Triple("mipsisa64r6el-unknown-linux-gnuabi64");
+  EXPECT_EQ(Triple::mips64el, T.getArch());
+  EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
+  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
+  std::string Error;
+  if (!TargetRegistry::lookupTarget("mips64el", T, Error))
+    GTEST_SKIP();
+  EXPECT_EQ(Triple::mips64el, T.getArch());
+  // The SubArch information needs to be preserved.
+  EXPECT_EQ(Triple::MipsSubArch_r6, T.getSubArch());
+  EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
+  EXPECT_EQ(Triple::Linux, T.getOS());
+  EXPECT_EQ(Triple::GNUABI64, T.getEnvironment());
+}
+
 } // end namespace



More information about the llvm-commits mailing list