Skip to content

Commit

Permalink
[LoongArch 1/6] Add triples loongarch{32,64} for the upcoming LoongAr…
Browse files Browse the repository at this point in the history
…ch 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
  • Loading branch information
SixWeining authored and rengolin committed Feb 10, 2022
1 parent fe0bf7d commit 42fd2bf
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 0 deletions.
4 changes: 4 additions & 0 deletions llvm/CODE_OWNERS.TXT
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,10 @@ E: sabre@nondot.org
W: http://nondot.org/~sabre/
D: Everything not covered by someone else

N: Weining Lu
E: luweining@loongson.cn
D: LoongArch backend (lib/Target/LoongArch/*)

N: David Majnemer
E: david.majnemer@gmail.com
D: IR Constant Folder, InstCombine
Expand Down
5 changes: 5 additions & 0 deletions llvm/docs/CompilerWriterInfo.rst
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@ C-SKY
* `C-SKY Architecture User Guide <https://github.com/c-sky/csky-doc/blob/master/CSKY%20Architecture%20user_guide.pdf>`_
* `C-SKY V2 ABI <https://github.com/c-sky/csky-doc/blob/master/C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf>`_

LoongArch
---------
* `LoongArch Reference Manual - Volume 1: Basic Architecture <https://loongson.github.io/LoongArch-Documentation/LoongArch-Vol1-EN.html>`_
* `LoongArch ELF ABI specification <https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html>`_

SPARC
-----

Expand Down
7 changes: 7 additions & 0 deletions llvm/include/llvm/ADT/Triple.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ class Triple {
bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)
csky, // CSKY: csky
hexagon, // Hexagon: hexagon
loongarch32, // LoongArch (32-bit): loongarch32
loongarch64, // LoongArch (64-bit): loongarch64
m68k, // M68k: Motorola 680x0 family
mips, // MIPS: mips, mipsallegrex, mipsr6
mipsel, // MIPSEL: mipsel, mipsallegrexe, mipsr6el
Expand Down Expand Up @@ -774,6 +776,11 @@ class Triple {
: PointerWidth == 64;
}

/// Tests whether the target is LoongArch (32- and 64-bit).
bool isLoongArch() const {
return getArch() == Triple::loongarch32 || getArch() == Triple::loongarch64;
}

/// Tests whether the target is MIPS 32-bit (little and big endian).
bool isMIPS32() const {
return getArch() == Triple::mips || getArch() == Triple::mipsel;
Expand Down
21 changes: 21 additions & 0 deletions llvm/lib/Support/Triple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
case lanai: return "lanai";
case le32: return "le32";
case le64: return "le64";
case loongarch32: return "loongarch32";
case loongarch64: return "loongarch64";
case m68k: return "m68k";
case mips64: return "mips64";
case mips64el: return "mips64el";
Expand Down Expand Up @@ -164,6 +166,9 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {

case ve: return "ve";
case csky: return "csky";

case loongarch32:
case loongarch64: return "loongarch";
}
}

Expand Down Expand Up @@ -340,6 +345,8 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
.Case("renderscript64", renderscript64)
.Case("ve", ve)
.Case("csky", csky)
.Case("loongarch32", loongarch32)
.Case("loongarch64", loongarch64)
.Default(UnknownArch);
}

Expand Down Expand Up @@ -475,6 +482,8 @@ static Triple::ArchType parseArch(StringRef ArchName) {
.Case("wasm32", Triple::wasm32)
.Case("wasm64", Triple::wasm64)
.Case("csky", Triple::csky)
.Case("loongarch32", Triple::loongarch32)
.Case("loongarch64", Triple::loongarch64)
.Default(Triple::UnknownArch);

// Some architectures require special parsing logic just to compute the
Expand Down Expand Up @@ -731,6 +740,8 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
case Triple::lanai:
case Triple::le32:
case Triple::le64:
case Triple::loongarch32:
case Triple::loongarch64:
case Triple::m68k:
case Triple::mips64:
case Triple::mips64el:
Expand Down Expand Up @@ -1290,6 +1301,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
case llvm::Triple::kalimba:
case llvm::Triple::lanai:
case llvm::Triple::le32:
case llvm::Triple::loongarch32:
case llvm::Triple::m68k:
case llvm::Triple::mips:
case llvm::Triple::mipsel:
Expand Down Expand Up @@ -1321,6 +1333,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
case llvm::Triple::bpfel:
case llvm::Triple::hsail64:
case llvm::Triple::le64:
case llvm::Triple::loongarch64:
case llvm::Triple::mips64:
case llvm::Triple::mips64el:
case llvm::Triple::nvptx64:
Expand Down Expand Up @@ -1377,6 +1390,7 @@ Triple Triple::get32BitArchVariant() const {
case Triple::kalimba:
case Triple::lanai:
case Triple::le32:
case Triple::loongarch32:
case Triple::m68k:
case Triple::mips:
case Triple::mipsel:
Expand Down Expand Up @@ -1406,6 +1420,7 @@ Triple Triple::get32BitArchVariant() const {
case Triple::amdil64: T.setArch(Triple::amdil); break;
case Triple::hsail64: T.setArch(Triple::hsail); break;
case Triple::le64: T.setArch(Triple::le32); break;
case Triple::loongarch64: T.setArch(Triple::loongarch32); break;
case Triple::mips64:
T.setArch(Triple::mips, getSubArch());
break;
Expand Down Expand Up @@ -1455,6 +1470,7 @@ Triple Triple::get64BitArchVariant() const {
case Triple::bpfel:
case Triple::hsail64:
case Triple::le64:
case Triple::loongarch64:
case Triple::mips64:
case Triple::mips64el:
case Triple::nvptx64:
Expand All @@ -1478,6 +1494,7 @@ Triple Triple::get64BitArchVariant() const {
case Triple::armeb: T.setArch(Triple::aarch64_be); break;
case Triple::hsail: T.setArch(Triple::hsail64); break;
case Triple::le32: T.setArch(Triple::le64); break;
case Triple::loongarch32: T.setArch(Triple::loongarch64); break;
case Triple::mips:
T.setArch(Triple::mips64, getSubArch());
break;
Expand Down Expand Up @@ -1517,6 +1534,8 @@ Triple Triple::getBigEndianArchVariant() const {
case Triple::kalimba:
case Triple::le32:
case Triple::le64:
case Triple::loongarch32:
case Triple::loongarch64:
case Triple::msp430:
case Triple::nvptx64:
case Triple::nvptx:
Expand Down Expand Up @@ -1617,6 +1636,8 @@ bool Triple::isLittleEndian() const {
case Triple::kalimba:
case Triple::le32:
case Triple::le64:
case Triple::loongarch32:
case Triple::loongarch64:
case Triple::mips64el:
case Triple::mipsel:
case Triple::msp430:
Expand Down
46 changes: 46 additions & 0 deletions llvm/unittests/ADT/TripleTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,18 @@ TEST(TripleTest, ParsedIDs) {
EXPECT_EQ(Triple::Linux, T.getOS());
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());

T = Triple("loongarch32-unknown-unknown");
EXPECT_EQ(Triple::loongarch32, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
EXPECT_EQ(Triple::UnknownOS, T.getOS());
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());

T = Triple("loongarch64-unknown-linux");
EXPECT_EQ(Triple::loongarch64, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
EXPECT_EQ(Triple::Linux, T.getOS());
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());

T = Triple("riscv32-unknown-unknown");
EXPECT_EQ(Triple::riscv32, T.getArch());
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
Expand Down Expand Up @@ -949,6 +961,18 @@ TEST(TripleTest, BitWidthPredicates) {
EXPECT_TRUE(T.isArch32Bit());
EXPECT_FALSE(T.isArch64Bit());
EXPECT_TRUE(T.isCSKY());

T.setArch(Triple::loongarch32);
EXPECT_FALSE(T.isArch16Bit());
EXPECT_TRUE(T.isArch32Bit());
EXPECT_FALSE(T.isArch64Bit());
EXPECT_TRUE(T.isLoongArch());

T.setArch(Triple::loongarch64);
EXPECT_FALSE(T.isArch16Bit());
EXPECT_FALSE(T.isArch32Bit());
EXPECT_TRUE(T.isArch64Bit());
EXPECT_TRUE(T.isLoongArch());
}

TEST(TripleTest, BitWidthArchVariants) {
Expand Down Expand Up @@ -1092,6 +1116,14 @@ TEST(TripleTest, BitWidthArchVariants) {
EXPECT_EQ(Triple::csky, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());

T.setArch(Triple::loongarch32);
EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());

T.setArch(Triple::loongarch64);
EXPECT_EQ(Triple::loongarch32, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::loongarch64, T.get64BitArchVariant().getArch());

T.setArch(Triple::thumbeb);
EXPECT_EQ(Triple::thumbeb, T.get32BitArchVariant().getArch());
EXPECT_EQ(Triple::aarch64_be, T.get64BitArchVariant().getArch());
Expand Down Expand Up @@ -1269,6 +1301,16 @@ TEST(TripleTest, EndianArchVariants) {
T.setArch(Triple::csky);
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
EXPECT_EQ(Triple::csky, T.getLittleEndianArchVariant().getArch());

T.setArch(Triple::loongarch32);
EXPECT_TRUE(T.isLittleEndian());
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
EXPECT_EQ(Triple::loongarch32, T.getLittleEndianArchVariant().getArch());

T.setArch(Triple::loongarch64);
EXPECT_TRUE(T.isLittleEndian());
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
EXPECT_EQ(Triple::loongarch64, T.getLittleEndianArchVariant().getArch());
}

TEST(TripleTest, getOSVersion) {
Expand Down Expand Up @@ -1485,6 +1527,10 @@ TEST(TripleTest, FileFormat) {
EXPECT_EQ(Triple::ELF, Triple("csky-unknown-unknown").getObjectFormat());
EXPECT_EQ(Triple::ELF, Triple("csky-unknown-linux").getObjectFormat());

EXPECT_EQ(Triple::ELF,
Triple("loongarch32-unknown-unknown").getObjectFormat());
EXPECT_EQ(Triple::ELF, Triple("loongarch64-unknown-linux").getObjectFormat());

Triple MSVCNormalized(Triple::normalize("i686-pc-windows-msvc-elf"));
EXPECT_EQ(Triple::ELF, MSVCNormalized.getObjectFormat());

Expand Down

0 comments on commit 42fd2bf

Please sign in to comment.