Skip to content

Commit 42fd2bf

Browse files
SixWeiningrengolin
authored andcommitted
[LoongArch 1/6] Add triples loongarch{32,64} for the upcoming LoongArch target
This is the first patch to incrementally add an MC layer for LoongArch to LLVM. This patch also adds unit testcases for these new triples. RFC for adding this new backend: https://lists.llvm.org/pipermail/llvm-dev/2021-December/154371.html Differential revision: https://reviews.llvm.org/D115857
1 parent fe0bf7d commit 42fd2bf

File tree

5 files changed

+83
-0
lines changed

5 files changed

+83
-0
lines changed

llvm/CODE_OWNERS.TXT

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ E: sabre@nondot.org
153153
W: http://nondot.org/~sabre/
154154
D: Everything not covered by someone else
155155

156+
N: Weining Lu
157+
E: luweining@loongson.cn
158+
D: LoongArch backend (lib/Target/LoongArch/*)
159+
156160
N: David Majnemer
157161
E: david.majnemer@gmail.com
158162
D: IR Constant Folder, InstCombine

llvm/docs/CompilerWriterInfo.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ C-SKY
107107
* `C-SKY Architecture User Guide <https://github.com/c-sky/csky-doc/blob/master/CSKY%20Architecture%20user_guide.pdf>`_
108108
* `C-SKY V2 ABI <https://github.com/c-sky/csky-doc/blob/master/C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf>`_
109109

110+
LoongArch
111+
---------
112+
* `LoongArch Reference Manual - Volume 1: Basic Architecture <https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html>`_
113+
* `LoongArch ELF ABI specification <https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html>`_
114+
110115
SPARC
111116
-----
112117

llvm/include/llvm/ADT/Triple.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ class Triple {
5757
bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)
5858
csky, // CSKY: csky
5959
hexagon, // Hexagon: hexagon
60+
loongarch32, // LoongArch (32-bit): loongarch32
61+
loongarch64, // LoongArch (64-bit): loongarch64
6062
m68k, // M68k: Motorola 680x0 family
6163
mips, // MIPS: mips, mipsallegrex, mipsr6
6264
mipsel, // MIPSEL: mipsel, mipsallegrexe, mipsr6el
@@ -774,6 +776,11 @@ class Triple {
774776
: PointerWidth == 64;
775777
}
776778

779+
/// Tests whether the target is LoongArch (32- and 64-bit).
780+
bool isLoongArch() const {
781+
return getArch() == Triple::loongarch32 || getArch() == Triple::loongarch64;
782+
}
783+
777784
/// Tests whether the target is MIPS 32-bit (little and big endian).
778785
bool isMIPS32() const {
779786
return getArch() == Triple::mips || getArch() == Triple::mipsel;

llvm/lib/Support/Triple.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
4444
case lanai: return "lanai";
4545
case le32: return "le32";
4646
case le64: return "le64";
47+
case loongarch32: return "loongarch32";
48+
case loongarch64: return "loongarch64";
4749
case m68k: return "m68k";
4850
case mips64: return "mips64";
4951
case mips64el: return "mips64el";
@@ -164,6 +166,9 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {
164166

165167
case ve: return "ve";
166168
case csky: return "csky";
169+
170+
case loongarch32:
171+
case loongarch64: return "loongarch";
167172
}
168173
}
169174

@@ -340,6 +345,8 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
340345
.Case("renderscript64", renderscript64)
341346
.Case("ve", ve)
342347
.Case("csky", csky)
348+
.Case("loongarch32", loongarch32)
349+
.Case("loongarch64", loongarch64)
343350
.Default(UnknownArch);
344351
}
345352

@@ -475,6 +482,8 @@ static Triple::ArchType parseArch(StringRef ArchName) {
475482
.Case("wasm32", Triple::wasm32)
476483
.Case("wasm64", Triple::wasm64)
477484
.Case("csky", Triple::csky)
485+
.Case("loongarch32", Triple::loongarch32)
486+
.Case("loongarch64", Triple::loongarch64)
478487
.Default(Triple::UnknownArch);
479488

480489
// Some architectures require special parsing logic just to compute the
@@ -731,6 +740,8 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
731740
case Triple::lanai:
732741
case Triple::le32:
733742
case Triple::le64:
743+
case Triple::loongarch32:
744+
case Triple::loongarch64:
734745
case Triple::m68k:
735746
case Triple::mips64:
736747
case Triple::mips64el:
@@ -1290,6 +1301,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
12901301
case llvm::Triple::kalimba:
12911302
case llvm::Triple::lanai:
12921303
case llvm::Triple::le32:
1304+
case llvm::Triple::loongarch32:
12931305
case llvm::Triple::m68k:
12941306
case llvm::Triple::mips:
12951307
case llvm::Triple::mipsel:
@@ -1321,6 +1333,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
13211333
case llvm::Triple::bpfel:
13221334
case llvm::Triple::hsail64:
13231335
case llvm::Triple::le64:
1336+
case llvm::Triple::loongarch64:
13241337
case llvm::Triple::mips64:
13251338
case llvm::Triple::mips64el:
13261339
case llvm::Triple::nvptx64:
@@ -1377,6 +1390,7 @@ Triple Triple::get32BitArchVariant() const {
13771390
case Triple::kalimba:
13781391
case Triple::lanai:
13791392
case Triple::le32:
1393+
case Triple::loongarch32:
13801394
case Triple::m68k:
13811395
case Triple::mips:
13821396
case Triple::mipsel:
@@ -1406,6 +1420,7 @@ Triple Triple::get32BitArchVariant() const {
14061420
case Triple::amdil64: T.setArch(Triple::amdil); break;
14071421
case Triple::hsail64: T.setArch(Triple::hsail); break;
14081422
case Triple::le64: T.setArch(Triple::le32); break;
1423+
case Triple::loongarch64: T.setArch(Triple::loongarch32); break;
14091424
case Triple::mips64:
14101425
T.setArch(Triple::mips, getSubArch());
14111426
break;
@@ -1455,6 +1470,7 @@ Triple Triple::get64BitArchVariant() const {
14551470
case Triple::bpfel:
14561471
case Triple::hsail64:
14571472
case Triple::le64:
1473+
case Triple::loongarch64:
14581474
case Triple::mips64:
14591475
case Triple::mips64el:
14601476
case Triple::nvptx64:
@@ -1478,6 +1494,7 @@ Triple Triple::get64BitArchVariant() const {
14781494
case Triple::armeb: T.setArch(Triple::aarch64_be); break;
14791495
case Triple::hsail: T.setArch(Triple::hsail64); break;
14801496
case Triple::le32: T.setArch(Triple::le64); break;
1497+
case Triple::loongarch32: T.setArch(Triple::loongarch64); break;
14811498
case Triple::mips:
14821499
T.setArch(Triple::mips64, getSubArch());
14831500
break;
@@ -1517,6 +1534,8 @@ Triple Triple::getBigEndianArchVariant() const {
15171534
case Triple::kalimba:
15181535
case Triple::le32:
15191536
case Triple::le64:
1537+
case Triple::loongarch32:
1538+
case Triple::loongarch64:
15201539
case Triple::msp430:
15211540
case Triple::nvptx64:
15221541
case Triple::nvptx:
@@ -1617,6 +1636,8 @@ bool Triple::isLittleEndian() const {
16171636
case Triple::kalimba:
16181637
case Triple::le32:
16191638
case Triple::le64:
1639+
case Triple::loongarch32:
1640+
case Triple::loongarch64:
16201641
case Triple::mips64el:
16211642
case Triple::mipsel:
16221643
case Triple::msp430:

llvm/unittests/ADT/TripleTest.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,18 @@ TEST(TripleTest, ParsedIDs) {
354354
EXPECT_EQ(Triple::Linux, T.getOS());
355355
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
356356

357+
T = Triple("loongarch32-unknown-unknown");
358+
EXPECT_EQ(Triple::loongarch32, T.getArch());
359+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
360+
EXPECT_EQ(Triple::UnknownOS, T.getOS());
361+
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
362+
363+
T = Triple("loongarch64-unknown-linux");
364+
EXPECT_EQ(Triple::loongarch64, T.getArch());
365+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
366+
EXPECT_EQ(Triple::Linux, T.getOS());
367+
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
368+
357369
T = Triple("riscv32-unknown-unknown");
358370
EXPECT_EQ(Triple::riscv32, T.getArch());
359371
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
@@ -949,6 +961,18 @@ TEST(TripleTest, BitWidthPredicates) {
949961
EXPECT_TRUE(T.isArch32Bit());
950962
EXPECT_FALSE(T.isArch64Bit());
951963
EXPECT_TRUE(T.isCSKY());
964+
965+
T.setArch(Triple::loongarch32);
966+
EXPECT_FALSE(T.isArch16Bit());
967+
EXPECT_TRUE(T.isArch32Bit());
968+
EXPECT_FALSE(T.isArch64Bit());
969+
EXPECT_TRUE(T.isLoongArch());
970+
971+
T.setArch(Triple::loongarch64);
972+
EXPECT_FALSE(T.isArch16Bit());
973+
EXPECT_FALSE(T.isArch32Bit());
974+
EXPECT_TRUE(T.isArch64Bit());
975+
EXPECT_TRUE(T.isLoongArch());
952976
}
953977

954978
TEST(TripleTest, BitWidthArchVariants) {
@@ -1092,6 +1116,14 @@ TEST(TripleTest, BitWidthArchVariants) {
10921116
EXPECT_EQ(Triple::csky, T.get32BitArchVariant().getArch());
10931117
EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
10941118

1119+
T.setArch(Triple::loongarch32);
1120+
EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
1121+
EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());
1122+
1123+
T.setArch(Triple::loongarch64);
1124+
EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
1125+
EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());
1126+
10951127
T.setArch(Triple::thumbeb);
10961128
EXPECT_EQ(Triple::thumbeb, T.get32BitArchVariant().getArch());
10971129
EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
@@ -1269,6 +1301,16 @@ TEST(TripleTest, EndianArchVariants) {
12691301
T.setArch(Triple::csky);
12701302
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
12711303
EXPECT_EQ(Triple::csky, T.getLittleEndianArchVariant().getArch());
1304+
1305+
T.setArch(Triple::loongarch32);
1306+
EXPECT_TRUE(T.isLittleEndian());
1307+
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1308+
EXPECT_EQ(Triple::loongarch32, T.getLittleEndianArchVariant().getArch());
1309+
1310+
T.setArch(Triple::loongarch64);
1311+
EXPECT_TRUE(T.isLittleEndian());
1312+
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1313+
EXPECT_EQ(Triple::loongarch64, T.getLittleEndianArchVariant().getArch());
12721314
}
12731315

12741316
TEST(TripleTest, getOSVersion) {
@@ -1485,6 +1527,10 @@ TEST(TripleTest, FileFormat) {
14851527
EXPECT_EQ(Triple::ELF, Triple("csky-unknown-unknown").getObjectFormat());
14861528
EXPECT_EQ(Triple::ELF, Triple("csky-unknown-linux").getObjectFormat());
14871529

1530+
EXPECT_EQ(Triple::ELF,
1531+
Triple("loongarch32-unknown-unknown").getObjectFormat());
1532+
EXPECT_EQ(Triple::ELF, Triple("loongarch64-unknown-linux").getObjectFormat());
1533+
14881534
Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
14891535
EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());
14901536

0 commit comments

Comments
 (0)