[clang] 15b65bc - [Clang][LoongArch] Add initial LoongArch target and driver support

Weining Lu via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 22 22:49:50 PDT 2022


Author: Weining Lu
Date: 2022-08-23T13:47:22+08:00
New Revision: 15b65bcd65195df8c9c0e84b64a1a825d9901ba6

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

LOG: [Clang][LoongArch] Add initial LoongArch target and driver support

With the initial support added, clang can compile `helloworld` C
to executable file for loongarch64. For example:

```
$ cat hello.c
int main() {
  printf("Hello, world!\n");
  return 0;
}
$ clang --target=loongarch64-unknown-linux-gnu --gcc-toolchain=xxx --sysroot=xxx hello.c
```

The output a.out can run within qemu or native machine. For example:

```
$ file ./a.out
./a.out: ELF 64-bit LSB pie executable, LoongArch, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-loongarch-lp64d.so.1, for GNU/Linux 5.19.0, with debug_info, not stripped
$ ./a.out
Hello, world!
```

Currently gcc toolchain and sysroot can be found here:
https://github.com/loongson/build-tools/releases/download/2022.08.11/loongarch64-clfs-5.1-cross-tools-gcc-glibc.tar.xz

Reference: https://github.com/loongson/LoongArch-Documentation
The last commit hash (main branch) is:
99016636af64d02dee05e39974d4c1e55875c45b

Note loongarch32 is not fully tested because there is no reference
gcc toolchain yet.

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

Added: 
    clang/lib/Basic/Targets/LoongArch.cpp
    clang/lib/Basic/Targets/LoongArch.h
    clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
    clang/lib/Driver/ToolChains/Arch/LoongArch.h
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/bin/.keep
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/include/.keep
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64d/crtbegin.o
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64f/crtbegin.o
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64s/crtbegin.o
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/crtbegin.o
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/bin/ld
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/lib/.keep
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/lib64/.keep
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib/.keep
    clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib64/.keep
    clang/test/Driver/loongarch-abi-error.c
    clang/test/Driver/loongarch-abi.c
    clang/test/Driver/loongarch-toolchain.c
    clang/test/Preprocessor/init-loongarch.c

Modified: 
    clang/lib/Basic/CMakeLists.txt
    clang/lib/Basic/Targets.cpp
    clang/lib/Driver/CMakeLists.txt
    clang/lib/Driver/ToolChains/Clang.cpp
    clang/lib/Driver/ToolChains/Clang.h
    clang/lib/Driver/ToolChains/Gnu.cpp
    clang/lib/Driver/ToolChains/Linux.cpp
    clang/test/Driver/frame-pointer.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt
index 3e052c0cf9957..5d197f59ac4f7 100644
--- a/clang/lib/Basic/CMakeLists.txt
+++ b/clang/lib/Basic/CMakeLists.txt
@@ -82,6 +82,7 @@ add_clang_library(clangBasic
   Targets/Hexagon.cpp
   Targets/Lanai.cpp
   Targets/Le64.cpp
+  Targets/LoongArch.cpp
   Targets/M68k.cpp
   Targets/MSP430.cpp
   Targets/Mips.cpp

diff  --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 2d6ef998485ae..38244800219ac 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -24,6 +24,7 @@
 #include "Targets/Hexagon.h"
 #include "Targets/Lanai.h"
 #include "Targets/Le64.h"
+#include "Targets/LoongArch.h"
 #include "Targets/M68k.h"
 #include "Targets/MSP430.h"
 #include "Targets/Mips.h"
@@ -670,6 +671,20 @@ TargetInfo *AllocateTarget(const llvm::Triple &Triple,
     default:
       return new CSKYTargetInfo(Triple, Opts);
     }
+  case llvm::Triple::loongarch32:
+    switch (os) {
+    case llvm::Triple::Linux:
+      return new LinuxTargetInfo<LoongArch32TargetInfo>(Triple, Opts);
+    default:
+      return new LoongArch32TargetInfo(Triple, Opts);
+    }
+  case llvm::Triple::loongarch64:
+    switch (os) {
+    case llvm::Triple::Linux:
+      return new LinuxTargetInfo<LoongArch64TargetInfo>(Triple, Opts);
+    default:
+      return new LoongArch64TargetInfo(Triple, Opts);
+    }
   }
 }
 } // namespace targets

diff  --git a/clang/lib/Basic/Targets/LoongArch.cpp b/clang/lib/Basic/Targets/LoongArch.cpp
new file mode 100644
index 0000000000000..34d8bdbe1dbdc
--- /dev/null
+++ b/clang/lib/Basic/Targets/LoongArch.cpp
@@ -0,0 +1,50 @@
+//===--- LoongArch.cpp - Implement LoongArch target feature support -------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements LoongArch TargetInfo objects.
+//
+//===----------------------------------------------------------------------===//
+
+#include "LoongArch.h"
+#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/MacroBuilder.h"
+#include "clang/Basic/TargetBuiltins.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/Support/TargetParser.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace clang;
+using namespace clang::targets;
+
+ArrayRef<const char *> LoongArchTargetInfo::getGCCRegNames() const {
+  // TODO: To be implemented in future.
+  return {};
+}
+
+ArrayRef<TargetInfo::GCCRegAlias>
+LoongArchTargetInfo::getGCCRegAliases() const {
+  // TODO: To be implemented in future.
+  return {};
+}
+
+bool LoongArchTargetInfo::validateAsmConstraint(
+    const char *&Name, TargetInfo::ConstraintInfo &Info) const {
+  // TODO: To be implemented in future.
+  return false;
+}
+
+void LoongArchTargetInfo::getTargetDefines(const LangOptions &Opts,
+                                           MacroBuilder &Builder) const {
+  Builder.defineMacro("__loongarch__");
+  // TODO: Define more macros.
+}
+
+ArrayRef<Builtin::Info> LoongArchTargetInfo::getTargetBuiltins() const {
+  // TODO: To be implemented in future.
+  return {};
+}

diff  --git a/clang/lib/Basic/Targets/LoongArch.h b/clang/lib/Basic/Targets/LoongArch.h
new file mode 100644
index 0000000000000..4380f149876c9
--- /dev/null
+++ b/clang/lib/Basic/Targets/LoongArch.h
@@ -0,0 +1,105 @@
+//===-- LoongArch.h - Declare LoongArch target feature support --*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares LoongArch TargetInfo objects.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H
+#define LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H
+
+#include "clang/Basic/TargetInfo.h"
+#include "clang/Basic/TargetOptions.h"
+#include "llvm/ADT/Triple.h"
+#include "llvm/Support/Compiler.h"
+
+namespace clang {
+namespace targets {
+
+class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo {
+protected:
+  std::string ABI;
+
+public:
+  LoongArchTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
+      : TargetInfo(Triple) {
+    LongDoubleWidth = 128;
+    LongDoubleAlign = 128;
+    LongDoubleFormat = &llvm::APFloat::IEEEquad();
+    SuitableAlign = 128;
+    WCharType = SignedInt;
+    WIntType = UnsignedInt;
+  }
+
+  StringRef getABI() const override { return ABI; }
+
+  void getTargetDefines(const LangOptions &Opts,
+                        MacroBuilder &Builder) const override;
+
+  ArrayRef<Builtin::Info> getTargetBuiltins() const override;
+
+  BuiltinVaListKind getBuiltinVaListKind() const override {
+    return TargetInfo::VoidPtrBuiltinVaList;
+  }
+
+  const char *getClobbers() const override { return ""; }
+
+  ArrayRef<const char *> getGCCRegNames() const override;
+
+  ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
+
+  bool validateAsmConstraint(const char *&Name,
+                             TargetInfo::ConstraintInfo &Info) const override;
+};
+
+class LLVM_LIBRARY_VISIBILITY LoongArch32TargetInfo
+    : public LoongArchTargetInfo {
+public:
+  LoongArch32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+      : LoongArchTargetInfo(Triple, Opts) {
+    IntPtrType = SignedInt;
+    PtrDiffType = SignedInt;
+    SizeType = UnsignedInt;
+    resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128");
+    // TODO: select appropriate ABI.
+    setABI("ilp32d");
+  }
+
+  bool setABI(const std::string &Name) override {
+    if (Name == "ilp32d" || Name == "ilp32f" || Name == "ilp32s") {
+      ABI = Name;
+      return true;
+    }
+    return false;
+  }
+};
+
+class LLVM_LIBRARY_VISIBILITY LoongArch64TargetInfo
+    : public LoongArchTargetInfo {
+public:
+  LoongArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+      : LoongArchTargetInfo(Triple, Opts) {
+    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
+    IntMaxType = Int64Type = SignedLong;
+    resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n64-S128");
+    // TODO: select appropriate ABI.
+    setABI("lp64d");
+  }
+
+  bool setABI(const std::string &Name) override {
+    if (Name == "lp64d" || Name == "lp64f" || Name == "lp64s") {
+      ABI = Name;
+      return true;
+    }
+    return false;
+  }
+};
+} // end namespace targets
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H

diff  --git a/clang/lib/Driver/CMakeLists.txt b/clang/lib/Driver/CMakeLists.txt
index 4817bcfbcb818..cfef82cf07791 100644
--- a/clang/lib/Driver/CMakeLists.txt
+++ b/clang/lib/Driver/CMakeLists.txt
@@ -30,6 +30,7 @@ add_clang_library(clangDriver
   ToolChains/Arch/AArch64.cpp
   ToolChains/Arch/ARM.cpp
   ToolChains/Arch/CSKY.cpp
+  ToolChains/Arch/LoongArch.cpp
   ToolChains/Arch/M68k.cpp
   ToolChains/Arch/Mips.cpp
   ToolChains/Arch/PPC.cpp

diff  --git a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
new file mode 100644
index 0000000000000..f8cda26ad3f8e
--- /dev/null
+++ b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
@@ -0,0 +1,28 @@
+//===--- LoongArch.cpp - LoongArch Helpers for Tools ------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "LoongArch.h"
+
+using namespace clang::driver::tools;
+using namespace clang;
+using namespace llvm::opt;
+
+StringRef loongarch::getLoongArchABI(const ArgList &Args,
+                                     const llvm::Triple &Triple) {
+  assert((Triple.getArch() == llvm::Triple::loongarch32 ||
+          Triple.getArch() == llvm::Triple::loongarch64) &&
+         "Unexpected triple");
+
+  // If `-mabi=` is specified, use it.
+  if (const Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
+    return A->getValue();
+
+  // Choose a default based on the triple.
+  // TODO: select appropiate ABI.
+  return Triple.getArch() == llvm::Triple::loongarch32 ? "ilp32d" : "lp64d";
+}

diff  --git a/clang/lib/Driver/ToolChains/Arch/LoongArch.h b/clang/lib/Driver/ToolChains/Arch/LoongArch.h
new file mode 100644
index 0000000000000..a128e611f8c3c
--- /dev/null
+++ b/clang/lib/Driver/ToolChains/Arch/LoongArch.h
@@ -0,0 +1,27 @@
+//===--- LoongArch.h - LoongArch-specific Tool Helpers ----------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_LOONGARCH_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_LOONGARCH_H
+
+#include "clang/Driver/Driver.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Option/Option.h"
+
+namespace clang {
+namespace driver {
+namespace tools {
+namespace loongarch {
+StringRef getLoongArchABI(const llvm::opt::ArgList &Args,
+                          const llvm::Triple &Triple);
+} // end namespace loongarch
+} // end namespace tools
+} // end namespace driver
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_LOONGARCH_H

diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index ee23621a3233a..b867adc553033 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -11,6 +11,7 @@
 #include "Arch/AArch64.h"
 #include "Arch/ARM.h"
 #include "Arch/CSKY.h"
+#include "Arch/LoongArch.h"
 #include "Arch/M68k.h"
 #include "Arch/Mips.h"
 #include "Arch/PPC.h"
@@ -536,6 +537,8 @@ static bool useFramePointerForTargetByDefault(const ArgList &Args,
   case llvm::Triple::amdgcn:
   case llvm::Triple::r600:
   case llvm::Triple::csky:
+  case llvm::Triple::loongarch32:
+  case llvm::Triple::loongarch64:
     return !areOptimizationsEnabled(Args);
   default:
     break;
@@ -1777,6 +1780,11 @@ void Clang::RenderTargetOptions(const llvm::Triple &EffectiveTriple,
     CmdArgs.push_back("-fallow-half-arguments-and-returns");
     break;
 
+  case llvm::Triple::loongarch32:
+  case llvm::Triple::loongarch64:
+    AddLoongArchTargetArgs(Args, CmdArgs);
+    break;
+
   case llvm::Triple::mips:
   case llvm::Triple::mipsel:
   case llvm::Triple::mips64:
@@ -1916,6 +1924,13 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
   AddUnalignedAccessWarning(CmdArgs);
 }
 
+void Clang::AddLoongArchTargetArgs(const ArgList &Args,
+                                   ArgStringList &CmdArgs) const {
+  CmdArgs.push_back("-target-abi");
+  CmdArgs.push_back(
+      loongarch::getLoongArchABI(Args, getToolChain().getTriple()).data());
+}
+
 void Clang::AddMIPSTargetArgs(const ArgList &Args,
                               ArgStringList &CmdArgs) const {
   const Driver &D = getToolChain().getDriver();

diff  --git a/clang/lib/Driver/ToolChains/Clang.h b/clang/lib/Driver/ToolChains/Clang.h
index 5209c6687599b..d7550665539cc 100644
--- a/clang/lib/Driver/ToolChains/Clang.h
+++ b/clang/lib/Driver/ToolChains/Clang.h
@@ -57,6 +57,8 @@ class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
                         bool KernelOrKext) const;
   void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
                           llvm::opt::ArgStringList &CmdArgs) const;
+  void AddLoongArchTargetArgs(const llvm::opt::ArgList &Args,
+                              llvm::opt::ArgStringList &CmdArgs) const;
   void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
                          llvm::opt::ArgStringList &CmdArgs) const;
   void AddPPCTargetArgs(const llvm::opt::ArgList &Args,

diff  --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index 701886e47d662..9730109dd993f 100644
--- a/clang/lib/Driver/ToolChains/Gnu.cpp
+++ b/clang/lib/Driver/ToolChains/Gnu.cpp
@@ -278,6 +278,10 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
     return "elf32_sparc";
   case llvm::Triple::sparcv9:
     return "elf64_sparc";
+  case llvm::Triple::loongarch32:
+    return "elf32loongarch";
+  case llvm::Triple::loongarch64:
+    return "elf64loongarch";
   case llvm::Triple::mips:
     return "elf32btsmip";
   case llvm::Triple::mipsel:
@@ -2229,6 +2233,10 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
       "i586-suse-linux",     "i686-montavista-linux", "i686-gnu",
   };
 
+  static const char *const LoongArch64LibDirs[] = {"/lib64", "/lib"};
+  static const char *const LoongArch64Triples[] = {
+      "loongarch64-linux-gnu", "loongarch64-unknown-linux-gnu"};
+
   static const char *const M68kLibDirs[] = {"/lib"};
   static const char *const M68kTriples[] = {
       "m68k-linux-gnu", "m68k-unknown-linux-gnu", "m68k-suse-linux"};
@@ -2476,6 +2484,11 @@ void Generic_GCC::GCCInstallationDetector::AddDefaultGCCPrefixes(
       BiarchTripleAliases.append(begin(X32Triples), end(X32Triples));
     }
     break;
+  // TODO: Handle loongarch32.
+  case llvm::Triple::loongarch64:
+    LibDirs.append(begin(LoongArch64LibDirs), end(LoongArch64LibDirs));
+    TripleAliases.append(begin(LoongArch64Triples), end(LoongArch64Triples));
+    break;
   case llvm::Triple::m68k:
     LibDirs.append(begin(M68kLibDirs), end(M68kLibDirs));
     TripleAliases.append(begin(M68kTriples), end(M68kTriples));
@@ -2861,6 +2874,8 @@ bool Generic_GCC::IsIntegratedAssemblerDefault() const {
   case llvm::Triple::csky:
   case llvm::Triple::hexagon:
   case llvm::Triple::lanai:
+  case llvm::Triple::loongarch32:
+  case llvm::Triple::loongarch64:
   case llvm::Triple::m68k:
   case llvm::Triple::mips:
   case llvm::Triple::mipsel:

diff  --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp
index f23797215c236..29f385f31564f 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -8,6 +8,7 @@
 
 #include "Linux.h"
 #include "Arch/ARM.h"
+#include "Arch/LoongArch.h"
 #include "Arch/Mips.h"
 #include "Arch/PPC.h"
 #include "Arch/RISCV.h"
@@ -466,6 +467,20 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const {
     Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
     break;
   }
+  case llvm::Triple::loongarch32: {
+    LibDir = "lib32";
+    Loader = ("ld-linux-loongarch-" +
+              tools::loongarch::getLoongArchABI(Args, Triple) + ".so.1")
+                 .str();
+    break;
+  }
+  case llvm::Triple::loongarch64: {
+    LibDir = "lib64";
+    Loader = ("ld-linux-loongarch-" +
+              tools::loongarch::getLoongArchABI(Args, Triple) + ".so.1")
+                 .str();
+    break;
+  }
   case llvm::Triple::m68k:
     LibDir = "lib";
     Loader = "ld.so.1";

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/bin/.keep b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/bin/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/include/.keep b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/include/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64d/crtbegin.o b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64d/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64f/crtbegin.o b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64f/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64s/crtbegin.o b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/base/lp64s/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/crtbegin.o b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/crtbegin.o
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/bin/ld b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/bin/ld
new file mode 100755
index 0000000000000..b23e55619b2ff
--- /dev/null
+++ b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/bin/ld
@@ -0,0 +1 @@
+#!/bin/true

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/lib/.keep b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/lib/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/lib64/.keep b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/loongarch64-unknown-linux-gnu/lib64/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib/.keep b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib64/.keep b/clang/test/Driver/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib64/.keep
new file mode 100644
index 0000000000000..e69de29bb2d1d

diff  --git a/clang/test/Driver/frame-pointer.c b/clang/test/Driver/frame-pointer.c
index 47884e4e20036..a007fda5aaf6e 100644
--- a/clang/test/Driver/frame-pointer.c
+++ b/clang/test/Driver/frame-pointer.c
@@ -57,6 +57,18 @@
 // RUN: %clang --target=riscv64-unknown-linux-gnu -### -S -O3 %s 2>&1 | FileCheck -check-prefix=CHECK3-64 %s
 // RUN: %clang --target=riscv64-unknown-linux-gnu -### -S -Os %s 2>&1 | FileCheck -check-prefix=CHECKs-64 %s
 
+// RUN: %clang --target=loongarch32 -### -S -O0 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK0-32 %s
+// RUN: %clang --target=loongarch32 -### -S -O1 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK1-32 %s
+// RUN: %clang --target=loongarch32 -### -S -O2 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK2-32 %s
+// RUN: %clang --target=loongarch32 -### -S -O3 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK3-32 %s
+// RUN: %clang --target=loongarch32 -### -S -Os %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECKs-32 %s
+
+// RUN: %clang --target=loongarch64 -### -S -O0 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK0-64 %s
+// RUN: %clang --target=loongarch64 -### -S -O1 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK1-64 %s
+// RUN: %clang --target=loongarch64 -### -S -O2 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK2-64 %s
+// RUN: %clang --target=loongarch64 -### -S -O3 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK3-64 %s
+// RUN: %clang --target=loongarch64 -### -S -Os %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECKs-64 %s
+
 // CHECK0-32: -mframe-pointer=all
 // CHECK1-32-NOT: -mframe-pointer=all
 // CHECK2-32-NOT: -mframe-pointer=all

diff  --git a/clang/test/Driver/loongarch-abi-error.c b/clang/test/Driver/loongarch-abi-error.c
new file mode 100644
index 0000000000000..2d4f4b925026b
--- /dev/null
+++ b/clang/test/Driver/loongarch-abi-error.c
@@ -0,0 +1,21 @@
+// RUN: not %clang --target=loongarch32-unknown-elf %s -fsyntax-only -mabi=lp64s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA32-LP64S %s
+// RUN: not %clang --target=loongarch32-unknown-elf %s -fsyntax-only -mabi=lp64f 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA32-LP64F %s
+// RUN: not %clang --target=loongarch32-unknown-elf %s -fsyntax-only -mabi=lp64d 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA32-LP64D %s
+
+// RUN: not %clang --target=loongarch64-unknown-elf %s -fsyntax-only -mabi=ilp32s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA64-ILP32S %s
+// RUN: not %clang --target=loongarch64-unknown-elf %s -fsyntax-only -mabi=ilp32f 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA64-ILP32F %s
+// RUN: not %clang --target=loongarch64-unknown-elf %s -fsyntax-only -mabi=ilp32d 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-LA64-ILP32D %s
+
+// CHECK-LA32-LP64S: error: unknown target ABI 'lp64s'
+// CHECK-LA32-LP64F: error: unknown target ABI 'lp64f'
+// CHECK-LA32-LP64D: error: unknown target ABI 'lp64d'
+
+// CHECK-LA64-ILP32S: error: unknown target ABI 'ilp32s'
+// CHECK-LA64-ILP32F: error: unknown target ABI 'ilp32f'
+// CHECK-LA64-ILP32D: error: unknown target ABI 'ilp32d'

diff  --git a/clang/test/Driver/loongarch-abi.c b/clang/test/Driver/loongarch-abi.c
new file mode 100644
index 0000000000000..9359f25dae322
--- /dev/null
+++ b/clang/test/Driver/loongarch-abi.c
@@ -0,0 +1,25 @@
+// RUN: %clang --target=loongarch32-unknown-elf %s -fsyntax-only -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=ILP32D %s
+// RUN: %clang --target=loongarch32-unknown-elf %s -fsyntax-only -### -mabi=ilp32s 2>&1 \
+// RUN:   | FileCheck --check-prefix=ILP32S %s
+// RUN: %clang --target=loongarch32-unknown-elf %s -fsyntax-only -### -mabi=ilp32f 2>&1 \
+// RUN:   | FileCheck --check-prefix=ILP32F %s
+// RUN: %clang --target=loongarch32-unknown-elf %s -fsyntax-only -### -mabi=ilp32d 2>&1 \
+// RUN:   | FileCheck --check-prefix=ILP32D %s
+
+// RUN: %clang --target=loongarch64-unknown-elf %s -fsyntax-only -### 2>&1 \
+// RUN:   | FileCheck --check-prefix=LP64D %s
+// RUN: %clang --target=loongarch64-unknown-elf %s -fsyntax-only -### -mabi=lp64s 2>&1 \
+// RUN:   | FileCheck --check-prefix=LP64S %s
+// RUN: %clang --target=loongarch64-unknown-elf %s -fsyntax-only -### -mabi=lp64f 2>&1 \
+// RUN:   | FileCheck --check-prefix=LP64F %s
+// RUN: %clang --target=loongarch64-unknown-elf %s -fsyntax-only -### -mabi=lp64d 2>&1 \
+// RUN:   | FileCheck --check-prefix=LP64D %s
+
+// ILP32S: "-target-abi" "ilp32s"
+// ILP32F: "-target-abi" "ilp32f"
+// ILP32D: "-target-abi" "ilp32d"
+
+// LP64S: "-target-abi" "lp64s"
+// LP64F: "-target-abi" "lp64f"
+// LP64D: "-target-abi" "lp64d"

diff  --git a/clang/test/Driver/loongarch-toolchain.c b/clang/test/Driver/loongarch-toolchain.c
new file mode 100644
index 0000000000000..2e6d360acf29d
--- /dev/null
+++ b/clang/test/Driver/loongarch-toolchain.c
@@ -0,0 +1,27 @@
+// UNSUPPORTED: system-windows
+/// A basic clang -cc1 command-line, and simple environment check.
+
+// RUN: %clang %s -### --target=loongarch32 2>&1 | FileCheck --check-prefix=CC1 %s -DTRIPLE=loongarch32
+// RUN: %clang %s -### --target=loongarch64 2>&1 | FileCheck --check-prefix=CC1 %s -DTRIPLE=loongarch64
+
+// CC1: "-cc1" "-triple" "[[TRIPLE]]"
+
+/// In the below tests, --rtlib=platform is used so that the driver ignores
+/// the configure-time CLANG_DEFAULT_RTLIB option when choosing the runtime lib.
+
+// RUN: env "PATH=" %clang -### %s -fuse-ld=ld -no-pie -mabi=lp64d \
+// RUN:   --target=loongarch64-unknown-linux-gnu --rtlib=platform \
+// RUN:   --gcc-toolchain=%S/Inputs/multilib_loongarch_linux_sdk \
+// RUN:   --sysroot=%S/Inputs/multilib_loongarch_linux_sdk/sysroot 2>&1 \
+// RUN:   | FileCheck --check-prefix=LA64 %s
+
+// LA64: "{{.*}}/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/../../../../loongarch64-unknown-linux-gnu/bin/ld"
+// LA64-SAME: {{^}} "--sysroot={{.*}}/Inputs/multilib_loongarch_linux_sdk/sysroot"
+// LA64-SAME: "-m" "elf64loongarch"
+// LA64-SAME: "-dynamic-linker" "/lib64/ld-linux-loongarch-lp64d.so.1"
+// LA64-SAME: "{{.*}}/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/crtbegin.o"
+// LA64-SAME: "-L{{.*}}/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0"
+// LA64-SAME: {{^}} "-L{{.*}}/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/../../../../loongarch64-unknown-linux-gnu/lib/../lib64"
+// LA64-SAME: {{^}} "-L{{.*}}/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib/../lib64"
+// LA64-SAME: {{^}} "-L{{.*}}/Inputs/multilib_loongarch_linux_sdk/lib/gcc/loongarch64-unknown-linux-gnu/12.1.0/../../../../loongarch64-unknown-linux-gnu/lib"
+// LA64-SAME: {{^}} "-L{{.*}}/Inputs/multilib_loongarch_linux_sdk/sysroot/usr/lib"

diff  --git a/clang/test/Preprocessor/init-loongarch.c b/clang/test/Preprocessor/init-loongarch.c
new file mode 100644
index 0000000000000..a6a0836e3fb1d
--- /dev/null
+++ b/clang/test/Preprocessor/init-loongarch.c
@@ -0,0 +1,641 @@
+// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple loongarch32 /dev/null \
+// RUN:   | FileCheck --match-full-lines --check-prefix=LA32 %s
+// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple loongarch32-unknown-linux /dev/null \
+// RUN:   | FileCheck --match-full-lines --check-prefixes=LA32,LA32-LINUX %s
+// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple loongarch32 \
+// RUN: -fforce-enable-int128 /dev/null | FileCheck --match-full-lines \
+// RUN: --check-prefixes=LA32,LA32-INT128 %s
+
+// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple loongarch64 /dev/null \
+// RUN:   | FileCheck --match-full-lines --check-prefix=LA64 %s
+// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple loongarch64-unknown-linux /dev/null \
+// RUN:   | FileCheck --match-full-lines --check-prefixes=LA64,LA64-LINUX %s
+// RUN: %clang_cc1 -E -dM -ffreestanding -fgnuc-version=4.2.1 -triple loongarch64 \
+// RUN: -fforce-enable-int128 /dev/null | FileCheck --match-full-lines \
+// RUN: --check-prefixes=LA64,LA64-INT128 %s
+
+//// Note that common macros are tested in init.c, such as __VERSION__. So they're not listed here.
+
+// LA32: #define _ILP32 1
+// LA32: #define __ATOMIC_ACQUIRE 2
+// LA32-NEXT: #define __ATOMIC_ACQ_REL 4
+// LA32-NEXT: #define __ATOMIC_CONSUME 1
+// LA32-NEXT: #define __ATOMIC_RELAXED 0
+// LA32-NEXT: #define __ATOMIC_RELEASE 3
+// LA32-NEXT: #define __ATOMIC_SEQ_CST 5
+// LA32: #define __BIGGEST_ALIGNMENT__ 16
+// LA32: #define __BITINT_MAXWIDTH__ 128
+// LA32: #define __BOOL_WIDTH__ 8
+// LA32: #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+// LA32: #define __CHAR16_TYPE__ unsigned short
+// LA32: #define __CHAR32_TYPE__ unsigned int
+// LA32: #define __CHAR_BIT__ 8
+// LA32: #define __CLANG_ATOMIC_BOOL_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_CHAR32_T_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_CHAR_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_INT_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_LLONG_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_LONG_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_POINTER_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_SHORT_LOCK_FREE 1
+// LA32: #define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 1
+// LA32: #define __DBL_DECIMAL_DIG__ 17
+// LA32: #define __DBL_DENORM_MIN__ 4.9406564584124654e-324
+// LA32: #define __DBL_DIG__ 15
+// LA32: #define __DBL_EPSILON__ 2.2204460492503131e-16
+// LA32: #define __DBL_HAS_DENORM__ 1
+// LA32: #define __DBL_HAS_INFINITY__ 1
+// LA32: #define __DBL_HAS_QUIET_NAN__ 1
+// LA32: #define __DBL_MANT_DIG__ 53
+// LA32: #define __DBL_MAX_10_EXP__ 308
+// LA32: #define __DBL_MAX_EXP__ 1024
+// LA32: #define __DBL_MAX__ 1.7976931348623157e+308
+// LA32: #define __DBL_MIN_10_EXP__ (-307)
+// LA32: #define __DBL_MIN_EXP__ (-1021)
+// LA32: #define __DBL_MIN__ 2.2250738585072014e-308
+// LA32: #define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
+// LA32: #define __FLT_DECIMAL_DIG__ 9
+// LA32: #define __FLT_DENORM_MIN__ 1.40129846e-45F
+// LA32: #define __FLT_DIG__ 6
+// LA32: #define __FLT_EPSILON__ 1.19209290e-7F
+// LA32: #define __FLT_HAS_DENORM__ 1
+// LA32: #define __FLT_HAS_INFINITY__ 1
+// LA32: #define __FLT_HAS_QUIET_NAN__ 1
+// LA32: #define __FLT_MANT_DIG__ 24
+// LA32: #define __FLT_MAX_10_EXP__ 38
+// LA32: #define __FLT_MAX_EXP__ 128
+// LA32: #define __FLT_MAX__ 3.40282347e+38F
+// LA32: #define __FLT_MIN_10_EXP__ (-37)
+// LA32: #define __FLT_MIN_EXP__ (-125)
+// LA32: #define __FLT_MIN__ 1.17549435e-38F
+// LA32: #define __FLT_RADIX__ 2
+// LA32: #define __GCC_ATOMIC_BOOL_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_CHAR_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_INT_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_LLONG_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_LONG_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_POINTER_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_SHORT_LOCK_FREE 1
+// LA32: #define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+// LA32: #define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 1
+// LA32: #define __ILP32__ 1
+// LA32: #define __INT16_C_SUFFIX__
+// LA32: #define __INT16_FMTd__ "hd"
+// LA32: #define __INT16_FMTi__ "hi"
+// LA32: #define __INT16_MAX__ 32767
+// LA32: #define __INT16_TYPE__ short
+// LA32: #define __INT32_C_SUFFIX__
+// LA32: #define __INT32_FMTd__ "d"
+// LA32: #define __INT32_FMTi__ "i"
+// LA32: #define __INT32_MAX__ 2147483647
+// LA32: #define __INT32_TYPE__ int
+// LA32: #define __INT64_C_SUFFIX__ LL
+// LA32: #define __INT64_FMTd__ "lld"
+// LA32: #define __INT64_FMTi__ "lli"
+// LA32: #define __INT64_MAX__ 9223372036854775807LL
+// LA32: #define __INT64_TYPE__ long long int
+// LA32: #define __INT8_C_SUFFIX__
+// LA32: #define __INT8_FMTd__ "hhd"
+// LA32: #define __INT8_FMTi__ "hhi"
+// LA32: #define __INT8_MAX__ 127
+// LA32: #define __INT8_TYPE__ signed char
+// LA32: #define __INTMAX_C_SUFFIX__ LL
+// LA32: #define __INTMAX_FMTd__ "lld"
+// LA32: #define __INTMAX_FMTi__ "lli"
+// LA32: #define __INTMAX_MAX__ 9223372036854775807LL
+// LA32: #define __INTMAX_TYPE__ long long int
+// LA32: #define __INTMAX_WIDTH__ 64
+// LA32: #define __INTPTR_FMTd__ "d"
+// LA32: #define __INTPTR_FMTi__ "i"
+// LA32: #define __INTPTR_MAX__ 2147483647
+// LA32: #define __INTPTR_TYPE__ int
+// LA32: #define __INTPTR_WIDTH__ 32
+// LA32: #define __INT_FAST16_FMTd__ "hd"
+// LA32: #define __INT_FAST16_FMTi__ "hi"
+// LA32: #define __INT_FAST16_MAX__ 32767
+// LA32: #define __INT_FAST16_TYPE__ short
+// LA32: #define __INT_FAST16_WIDTH__ 16
+// LA32: #define __INT_FAST32_FMTd__ "d"
+// LA32: #define __INT_FAST32_FMTi__ "i"
+// LA32: #define __INT_FAST32_MAX__ 2147483647
+// LA32: #define __INT_FAST32_TYPE__ int
+// LA32: #define __INT_FAST32_WIDTH__ 32
+// LA32: #define __INT_FAST64_FMTd__ "lld"
+// LA32: #define __INT_FAST64_FMTi__ "lli"
+// LA32: #define __INT_FAST64_MAX__ 9223372036854775807LL
+// LA32: #define __INT_FAST64_TYPE__ long long int
+// LA32: #define __INT_FAST64_WIDTH__ 64
+// LA32: #define __INT_FAST8_FMTd__ "hhd"
+// LA32: #define __INT_FAST8_FMTi__ "hhi"
+// LA32: #define __INT_FAST8_MAX__ 127
+// LA32: #define __INT_FAST8_TYPE__ signed char
+// LA32: #define __INT_FAST8_WIDTH__ 8
+// LA32: #define __INT_LEAST16_FMTd__ "hd"
+// LA32: #define __INT_LEAST16_FMTi__ "hi"
+// LA32: #define __INT_LEAST16_MAX__ 32767
+// LA32: #define __INT_LEAST16_TYPE__ short
+// LA32: #define __INT_LEAST16_WIDTH__ 16
+// LA32: #define __INT_LEAST32_FMTd__ "d"
+// LA32: #define __INT_LEAST32_FMTi__ "i"
+// LA32: #define __INT_LEAST32_MAX__ 2147483647
+// LA32: #define __INT_LEAST32_TYPE__ int
+// LA32: #define __INT_LEAST32_WIDTH__ 32
+// LA32: #define __INT_LEAST64_FMTd__ "lld"
+// LA32: #define __INT_LEAST64_FMTi__ "lli"
+// LA32: #define __INT_LEAST64_MAX__ 9223372036854775807LL
+// LA32: #define __INT_LEAST64_TYPE__ long long int
+// LA32: #define __INT_LEAST64_WIDTH__ 64
+// LA32: #define __INT_LEAST8_FMTd__ "hhd"
+// LA32: #define __INT_LEAST8_FMTi__ "hhi"
+// LA32: #define __INT_LEAST8_MAX__ 127
+// LA32: #define __INT_LEAST8_TYPE__ signed char
+// LA32: #define __INT_LEAST8_WIDTH__ 8
+// LA32: #define __INT_MAX__ 2147483647
+// LA32: #define __INT_WIDTH__ 32
+// LA32: #define __LDBL_DECIMAL_DIG__ 36
+// LA32: #define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L
+// LA32: #define __LDBL_DIG__ 33
+// LA32: #define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L
+// LA32: #define __LDBL_HAS_DENORM__ 1
+// LA32: #define __LDBL_HAS_INFINITY__ 1
+// LA32: #define __LDBL_HAS_QUIET_NAN__ 1
+// LA32: #define __LDBL_MANT_DIG__ 113
+// LA32: #define __LDBL_MAX_10_EXP__ 4932
+// LA32: #define __LDBL_MAX_EXP__ 16384
+// LA32: #define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L
+// LA32: #define __LDBL_MIN_10_EXP__ (-4931)
+// LA32: #define __LDBL_MIN_EXP__ (-16381)
+// LA32: #define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
+// LA32: #define __LITTLE_ENDIAN__ 1
+// LA32: #define __LLONG_WIDTH__ 64
+// LA32: #define __LONG_LONG_MAX__ 9223372036854775807LL
+// LA32: #define __LONG_MAX__ 2147483647L
+// LA32: #define __LONG_WIDTH__ 32
+// LA32: #define __NO_INLINE__ 1
+// LA32: #define __NO_MATH_ERRNO__ 1
+// LA32: #define __OBJC_BOOL_IS_BOOL 0
+// LA32: #define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
+// LA32: #define __OPENCL_MEMORY_SCOPE_DEVICE 2
+// LA32: #define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
+// LA32: #define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
+// LA32: #define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
+// LA32: #define __POINTER_WIDTH__ 32
+// LA32: #define __PRAGMA_REDEFINE_EXTNAME 1
+// LA32: #define __PTRDIFF_FMTd__ "d"
+// LA32: #define __PTRDIFF_FMTi__ "i"
+// LA32: #define __PTRDIFF_MAX__ 2147483647
+// LA32: #define __PTRDIFF_TYPE__ int
+// LA32: #define __PTRDIFF_WIDTH__ 32
+// LA32: #define __SCHAR_MAX__ 127
+// LA32: #define __SHRT_MAX__ 32767
+// LA32: #define __SHRT_WIDTH__ 16
+// LA32: #define __SIG_ATOMIC_MAX__ 2147483647
+// LA32: #define __SIG_ATOMIC_WIDTH__ 32
+// LA32: #define __SIZEOF_DOUBLE__ 8
+// LA32: #define __SIZEOF_FLOAT__ 4
+// LA32-INT128: #define __SIZEOF_INT128__ 16
+// LA32: #define __SIZEOF_INT__ 4
+// LA32: #define __SIZEOF_LONG_DOUBLE__ 16
+// LA32: #define __SIZEOF_LONG_LONG__ 8
+// LA32: #define __SIZEOF_LONG__ 4
+// LA32: #define __SIZEOF_POINTER__ 4
+// LA32: #define __SIZEOF_PTRDIFF_T__ 4
+// LA32: #define __SIZEOF_SHORT__ 2
+// LA32: #define __SIZEOF_SIZE_T__ 4
+// LA32: #define __SIZEOF_WCHAR_T__ 4
+// LA32: #define __SIZEOF_WINT_T__ 4
+// LA32: #define __SIZE_FMTX__ "X"
+// LA32: #define __SIZE_FMTo__ "o"
+// LA32: #define __SIZE_FMTu__ "u"
+// LA32: #define __SIZE_FMTx__ "x"
+// LA32: #define __SIZE_MAX__ 4294967295U
+// LA32: #define __SIZE_TYPE__ unsigned int
+// LA32: #define __SIZE_WIDTH__ 32
+// LA32: #define __STDC_HOSTED__ 0
+// LA32: #define __STDC_UTF_16__ 1
+// LA32: #define __STDC_UTF_32__ 1
+// LA32: #define __STDC_VERSION__ 201710L
+// LA32: #define __STDC__ 1
+// LA32: #define __UINT16_C_SUFFIX__
+// LA32: #define __UINT16_FMTX__ "hX"
+// LA32: #define __UINT16_FMTo__ "ho"
+// LA32: #define __UINT16_FMTu__ "hu"
+// LA32: #define __UINT16_FMTx__ "hx"
+// LA32: #define __UINT16_MAX__ 65535
+// LA32: #define __UINT16_TYPE__ unsigned short
+// LA32: #define __UINT32_C_SUFFIX__ U
+// LA32: #define __UINT32_FMTX__ "X"
+// LA32: #define __UINT32_FMTo__ "o"
+// LA32: #define __UINT32_FMTu__ "u"
+// LA32: #define __UINT32_FMTx__ "x"
+// LA32: #define __UINT32_MAX__ 4294967295U
+// LA32: #define __UINT32_TYPE__ unsigned int
+// LA32: #define __UINT64_C_SUFFIX__ ULL
+// LA32: #define __UINT64_FMTX__ "llX"
+// LA32: #define __UINT64_FMTo__ "llo"
+// LA32: #define __UINT64_FMTu__ "llu"
+// LA32: #define __UINT64_FMTx__ "llx"
+// LA32: #define __UINT64_MAX__ 18446744073709551615ULL
+// LA32: #define __UINT64_TYPE__ long long unsigned int
+// LA32: #define __UINT8_C_SUFFIX__
+// LA32: #define __UINT8_FMTX__ "hhX"
+// LA32: #define __UINT8_FMTo__ "hho"
+// LA32: #define __UINT8_FMTu__ "hhu"
+// LA32: #define __UINT8_FMTx__ "hhx"
+// LA32: #define __UINT8_MAX__ 255
+// LA32: #define __UINT8_TYPE__ unsigned char
+// LA32: #define __UINTMAX_C_SUFFIX__ ULL
+// LA32: #define __UINTMAX_FMTX__ "llX"
+// LA32: #define __UINTMAX_FMTo__ "llo"
+// LA32: #define __UINTMAX_FMTu__ "llu"
+// LA32: #define __UINTMAX_FMTx__ "llx"
+// LA32: #define __UINTMAX_MAX__ 18446744073709551615ULL
+// LA32: #define __UINTMAX_TYPE__ long long unsigned int
+// LA32: #define __UINTMAX_WIDTH__ 64
+// LA32: #define __UINTPTR_FMTX__ "X"
+// LA32: #define __UINTPTR_FMTo__ "o"
+// LA32: #define __UINTPTR_FMTu__ "u"
+// LA32: #define __UINTPTR_FMTx__ "x"
+// LA32: #define __UINTPTR_MAX__ 4294967295U
+// LA32: #define __UINTPTR_TYPE__ unsigned int
+// LA32: #define __UINTPTR_WIDTH__ 32
+// LA32: #define __UINT_FAST16_FMTX__ "hX"
+// LA32: #define __UINT_FAST16_FMTo__ "ho"
+// LA32: #define __UINT_FAST16_FMTu__ "hu"
+// LA32: #define __UINT_FAST16_FMTx__ "hx"
+// LA32: #define __UINT_FAST16_MAX__ 65535
+// TODO: LoongArch GCC defines UINT_FAST16 to be long unsigned int
+// LA32: #define __UINT_FAST16_TYPE__ unsigned short
+// LA32: #define __UINT_FAST32_FMTX__ "X"
+// LA32: #define __UINT_FAST32_FMTo__ "o"
+// LA32: #define __UINT_FAST32_FMTu__ "u"
+// LA32: #define __UINT_FAST32_FMTx__ "x"
+// LA32: #define __UINT_FAST32_MAX__ 4294967295U
+// LA32: #define __UINT_FAST32_TYPE__ unsigned int
+// LA32: #define __UINT_FAST64_FMTX__ "llX"
+// LA32: #define __UINT_FAST64_FMTo__ "llo"
+// LA32: #define __UINT_FAST64_FMTu__ "llu"
+// LA32: #define __UINT_FAST64_FMTx__ "llx"
+// LA32: #define __UINT_FAST64_MAX__ 18446744073709551615ULL
+// LA32: #define __UINT_FAST64_TYPE__ long long unsigned int
+// LA32: #define __UINT_FAST8_FMTX__ "hhX"
+// LA32: #define __UINT_FAST8_FMTo__ "hho"
+// LA32: #define __UINT_FAST8_FMTu__ "hhu"
+// LA32: #define __UINT_FAST8_FMTx__ "hhx"
+// LA32: #define __UINT_FAST8_MAX__ 255
+// LA32: #define __UINT_FAST8_TYPE__ unsigned char
+// LA32: #define __UINT_LEAST16_FMTX__ "hX"
+// LA32: #define __UINT_LEAST16_FMTo__ "ho"
+// LA32: #define __UINT_LEAST16_FMTu__ "hu"
+// LA32: #define __UINT_LEAST16_FMTx__ "hx"
+// LA32: #define __UINT_LEAST16_MAX__ 65535
+// LA32: #define __UINT_LEAST16_TYPE__ unsigned short
+// LA32: #define __UINT_LEAST32_FMTX__ "X"
+// LA32: #define __UINT_LEAST32_FMTo__ "o"
+// LA32: #define __UINT_LEAST32_FMTu__ "u"
+// LA32: #define __UINT_LEAST32_FMTx__ "x"
+// LA32: #define __UINT_LEAST32_MAX__ 4294967295U
+// LA32: #define __UINT_LEAST32_TYPE__ unsigned int
+// LA32: #define __UINT_LEAST64_FMTX__ "llX"
+// LA32: #define __UINT_LEAST64_FMTo__ "llo"
+// LA32: #define __UINT_LEAST64_FMTu__ "llu"
+// LA32: #define __UINT_LEAST64_FMTx__ "llx"
+// LA32: #define __UINT_LEAST64_MAX__ 18446744073709551615ULL
+// LA32: #define __UINT_LEAST64_TYPE__ long long unsigned int
+// LA32: #define __UINT_LEAST8_FMTX__ "hhX"
+// LA32: #define __UINT_LEAST8_FMTo__ "hho"
+// LA32: #define __UINT_LEAST8_FMTu__ "hhu"
+// LA32: #define __UINT_LEAST8_FMTx__ "hhx"
+// LA32: #define __UINT_LEAST8_MAX__ 255
+// LA32: #define __UINT_LEAST8_TYPE__ unsigned char
+// LA32: #define __USER_LABEL_PREFIX__
+// LA32: #define __WCHAR_MAX__ 2147483647
+// LA32: #define __WCHAR_TYPE__ int
+// LA32: #define __WCHAR_WIDTH__ 32
+// LA32: #define __WINT_MAX__ 4294967295U
+// LA32: #define __WINT_TYPE__ unsigned int
+// LA32: #define __WINT_UNSIGNED__ 1
+// LA32: #define __WINT_WIDTH__ 32
+// LA32-LINUX: #define __gnu_linux__ 1
+// LA32-LINUX: #define __linux 1
+// LA32-LINUX: #define __linux__ 1
+// LA32: #define __loongarch__ 1
+// LA32-LINUX: #define __unix 1
+// LA32-LINUX: #define __unix__ 1
+// LA32-LINUX: #define linux 1
+// LA32-LINUX: #define unix 1
+
+// LA64: #define _LP64 1
+// LA64: #define __ATOMIC_ACQUIRE 2
+// LA64-NEXT: #define __ATOMIC_ACQ_REL 4
+// LA64-NEXT: #define __ATOMIC_CONSUME 1
+// LA64-NEXT: #define __ATOMIC_RELAXED 0
+// LA64-NEXT: #define __ATOMIC_RELEASE 3
+// LA64-NEXT: #define __ATOMIC_SEQ_CST 5
+// LA64: #define __BIGGEST_ALIGNMENT__ 16
+// LA64: #define __BITINT_MAXWIDTH__ 128
+// LA64: #define __BOOL_WIDTH__ 8
+// LA64: #define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__
+// LA64: #define __CHAR16_TYPE__ unsigned short
+// LA64: #define __CHAR32_TYPE__ unsigned int
+// LA64: #define __CHAR_BIT__ 8
+// LA64: #define __CLANG_ATOMIC_BOOL_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_CHAR32_T_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_CHAR_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_INT_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_LLONG_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_LONG_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_POINTER_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_SHORT_LOCK_FREE 1
+// LA64: #define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 1
+// LA64: #define __DBL_DECIMAL_DIG__ 17
+// LA64: #define __DBL_DENORM_MIN__ 4.9406564584124654e-324
+// LA64: #define __DBL_DIG__ 15
+// LA64: #define __DBL_EPSILON__ 2.2204460492503131e-16
+// LA64: #define __DBL_HAS_DENORM__ 1
+// LA64: #define __DBL_HAS_INFINITY__ 1
+// LA64: #define __DBL_HAS_QUIET_NAN__ 1
+// LA64: #define __DBL_MANT_DIG__ 53
+// LA64: #define __DBL_MAX_10_EXP__ 308
+// LA64: #define __DBL_MAX_EXP__ 1024
+// LA64: #define __DBL_MAX__ 1.7976931348623157e+308
+// LA64: #define __DBL_MIN_10_EXP__ (-307)
+// LA64: #define __DBL_MIN_EXP__ (-1021)
+// LA64: #define __DBL_MIN__ 2.2250738585072014e-308
+// LA64: #define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
+// LA64: #define __FLT_DECIMAL_DIG__ 9
+// LA64: #define __FLT_DENORM_MIN__ 1.40129846e-45F
+// LA64: #define __FLT_DIG__ 6
+// LA64: #define __FLT_EPSILON__ 1.19209290e-7F
+// LA64: #define __FLT_HAS_DENORM__ 1
+// LA64: #define __FLT_HAS_INFINITY__ 1
+// LA64: #define __FLT_HAS_QUIET_NAN__ 1
+// LA64: #define __FLT_MANT_DIG__ 24
+// LA64: #define __FLT_MAX_10_EXP__ 38
+// LA64: #define __FLT_MAX_EXP__ 128
+// LA64: #define __FLT_MAX__ 3.40282347e+38F
+// LA64: #define __FLT_MIN_10_EXP__ (-37)
+// LA64: #define __FLT_MIN_EXP__ (-125)
+// LA64: #define __FLT_MIN__ 1.17549435e-38F
+// LA64: #define __FLT_RADIX__ 2
+// LA64: #define __GCC_ATOMIC_BOOL_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_CHAR_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_INT_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_LLONG_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_LONG_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_POINTER_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_SHORT_LOCK_FREE 1
+// LA64: #define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
+// LA64: #define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 1
+// LA64: #define __INT16_C_SUFFIX__
+// LA64: #define __INT16_FMTd__ "hd"
+// LA64: #define __INT16_FMTi__ "hi"
+// LA64: #define __INT16_MAX__ 32767
+// LA64: #define __INT16_TYPE__ short
+// LA64: #define __INT32_C_SUFFIX__
+// LA64: #define __INT32_FMTd__ "d"
+// LA64: #define __INT32_FMTi__ "i"
+// LA64: #define __INT32_MAX__ 2147483647
+// LA64: #define __INT32_TYPE__ int
+// LA64: #define __INT64_C_SUFFIX__ L
+// LA64: #define __INT64_FMTd__ "ld"
+// LA64: #define __INT64_FMTi__ "li"
+// LA64: #define __INT64_MAX__ 9223372036854775807L
+// LA64: #define __INT64_TYPE__ long int
+// LA64: #define __INT8_C_SUFFIX__
+// LA64: #define __INT8_FMTd__ "hhd"
+// LA64: #define __INT8_FMTi__ "hhi"
+// LA64: #define __INT8_MAX__ 127
+// LA64: #define __INT8_TYPE__ signed char
+// LA64: #define __INTMAX_C_SUFFIX__ L
+// LA64: #define __INTMAX_FMTd__ "ld"
+// LA64: #define __INTMAX_FMTi__ "li"
+// LA64: #define __INTMAX_MAX__ 9223372036854775807L
+// LA64: #define __INTMAX_TYPE__ long int
+// LA64: #define __INTMAX_WIDTH__ 64
+// LA64: #define __INTPTR_FMTd__ "ld"
+// LA64: #define __INTPTR_FMTi__ "li"
+// LA64: #define __INTPTR_MAX__ 9223372036854775807L
+// LA64: #define __INTPTR_TYPE__ long int
+// LA64: #define __INTPTR_WIDTH__ 64
+// LA64: #define __INT_FAST16_FMTd__ "hd"
+// LA64: #define __INT_FAST16_FMTi__ "hi"
+// LA64: #define __INT_FAST16_MAX__ 32767
+// LA64: #define __INT_FAST16_TYPE__ short
+// LA64: #define __INT_FAST16_WIDTH__ 16
+// LA64: #define __INT_FAST32_FMTd__ "d"
+// LA64: #define __INT_FAST32_FMTi__ "i"
+// LA64: #define __INT_FAST32_MAX__ 2147483647
+// LA64: #define __INT_FAST32_TYPE__ int
+// LA64: #define __INT_FAST32_WIDTH__ 32
+// LA64: #define __INT_FAST64_FMTd__ "ld"
+// LA64: #define __INT_FAST64_FMTi__ "li"
+// LA64: #define __INT_FAST64_MAX__ 9223372036854775807L
+// LA64: #define __INT_FAST64_TYPE__ long int
+// LA64: #define __INT_FAST64_WIDTH__ 64
+// LA64: #define __INT_FAST8_FMTd__ "hhd"
+// LA64: #define __INT_FAST8_FMTi__ "hhi"
+// LA64: #define __INT_FAST8_MAX__ 127
+// LA64: #define __INT_FAST8_TYPE__ signed char
+// LA64: #define __INT_FAST8_WIDTH__ 8
+// LA64: #define __INT_LEAST16_FMTd__ "hd"
+// LA64: #define __INT_LEAST16_FMTi__ "hi"
+// LA64: #define __INT_LEAST16_MAX__ 32767
+// LA64: #define __INT_LEAST16_TYPE__ short
+// LA64: #define __INT_LEAST16_WIDTH__ 16
+// LA64: #define __INT_LEAST32_FMTd__ "d"
+// LA64: #define __INT_LEAST32_FMTi__ "i"
+// LA64: #define __INT_LEAST32_MAX__ 2147483647
+// LA64: #define __INT_LEAST32_TYPE__ int
+// LA64: #define __INT_LEAST32_WIDTH__ 32
+// LA64: #define __INT_LEAST64_FMTd__ "ld"
+// LA64: #define __INT_LEAST64_FMTi__ "li"
+// LA64: #define __INT_LEAST64_MAX__ 9223372036854775807L
+// LA64: #define __INT_LEAST64_TYPE__ long int
+// LA64: #define __INT_LEAST64_WIDTH__ 64
+// LA64: #define __INT_LEAST8_FMTd__ "hhd"
+// LA64: #define __INT_LEAST8_FMTi__ "hhi"
+// LA64: #define __INT_LEAST8_MAX__ 127
+// LA64: #define __INT_LEAST8_TYPE__ signed char
+// LA64: #define __INT_LEAST8_WIDTH__ 8
+// LA64: #define __INT_MAX__ 2147483647
+// LA64: #define __INT_WIDTH__ 32
+// LA64: #define __LDBL_DECIMAL_DIG__ 36
+// LA64: #define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L
+// LA64: #define __LDBL_DIG__ 33
+// LA64: #define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L
+// LA64: #define __LDBL_HAS_DENORM__ 1
+// LA64: #define __LDBL_HAS_INFINITY__ 1
+// LA64: #define __LDBL_HAS_QUIET_NAN__ 1
+// LA64: #define __LDBL_MANT_DIG__ 113
+// LA64: #define __LDBL_MAX_10_EXP__ 4932
+// LA64: #define __LDBL_MAX_EXP__ 16384
+// LA64: #define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L
+// LA64: #define __LDBL_MIN_10_EXP__ (-4931)
+// LA64: #define __LDBL_MIN_EXP__ (-16381)
+// LA64: #define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
+// LA64: #define __LITTLE_ENDIAN__ 1
+// LA64: #define __LLONG_WIDTH__ 64
+// LA64: #define __LONG_LONG_MAX__ 9223372036854775807LL
+// LA64: #define __LONG_MAX__ 9223372036854775807L
+// LA64: #define __LONG_WIDTH__ 64
+// LA64: #define __LP64__ 1
+// LA64: #define __NO_INLINE__ 1
+// LA64: #define __NO_MATH_ERRNO__ 1
+// LA64: #define __OBJC_BOOL_IS_BOOL 0
+// LA64: #define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
+// LA64: #define __OPENCL_MEMORY_SCOPE_DEVICE 2
+// LA64: #define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
+// LA64: #define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
+// LA64: #define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
+// LA64: #define __POINTER_WIDTH__ 64
+// LA64: #define __PRAGMA_REDEFINE_EXTNAME 1
+// LA64: #define __PTRDIFF_FMTd__ "ld"
+// LA64: #define __PTRDIFF_FMTi__ "li"
+// LA64: #define __PTRDIFF_MAX__ 9223372036854775807L
+// LA64: #define __PTRDIFF_TYPE__ long int
+// LA64: #define __PTRDIFF_WIDTH__ 64
+// LA64: #define __SCHAR_MAX__ 127
+// LA64: #define __SHRT_MAX__ 32767
+// LA64: #define __SHRT_WIDTH__ 16
+// LA64: #define __SIG_ATOMIC_MAX__ 2147483647
+// LA64: #define __SIG_ATOMIC_WIDTH__ 32
+// LA64: #define __SIZEOF_DOUBLE__ 8
+// LA64: #define __SIZEOF_FLOAT__ 4
+// LA64-INT128: #define __SIZEOF_INT128__ 16
+// LA64: #define __SIZEOF_INT__ 4
+// LA64: #define __SIZEOF_LONG_DOUBLE__ 16
+// LA64: #define __SIZEOF_LONG_LONG__ 8
+// LA64: #define __SIZEOF_LONG__ 8
+// LA64: #define __SIZEOF_POINTER__ 8
+// LA64: #define __SIZEOF_PTRDIFF_T__ 8
+// LA64: #define __SIZEOF_SHORT__ 2
+// LA64: #define __SIZEOF_SIZE_T__ 8
+// LA64: #define __SIZEOF_WCHAR_T__ 4
+// LA64: #define __SIZEOF_WINT_T__ 4
+// LA64: #define __SIZE_FMTX__ "lX"
+// LA64: #define __SIZE_FMTo__ "lo"
+// LA64: #define __SIZE_FMTu__ "lu"
+// LA64: #define __SIZE_FMTx__ "lx"
+// LA64: #define __SIZE_MAX__ 18446744073709551615UL
+// LA64: #define __SIZE_TYPE__ long unsigned int
+// LA64: #define __SIZE_WIDTH__ 64
+// LA64: #define __STDC_HOSTED__ 0
+// LA64: #define __STDC_UTF_16__ 1
+// LA64: #define __STDC_UTF_32__ 1
+// LA64: #define __STDC_VERSION__ 201710L
+// LA64: #define __STDC__ 1
+// LA64: #define __UINT16_C_SUFFIX__
+// LA64: #define __UINT16_FMTX__ "hX"
+// LA64: #define __UINT16_FMTo__ "ho"
+// LA64: #define __UINT16_FMTu__ "hu"
+// LA64: #define __UINT16_FMTx__ "hx"
+// LA64: #define __UINT16_MAX__ 65535
+// LA64: #define __UINT16_TYPE__ unsigned short
+// LA64: #define __UINT32_C_SUFFIX__ U
+// LA64: #define __UINT32_FMTX__ "X"
+// LA64: #define __UINT32_FMTo__ "o"
+// LA64: #define __UINT32_FMTu__ "u"
+// LA64: #define __UINT32_FMTx__ "x"
+// LA64: #define __UINT32_MAX__ 4294967295U
+// LA64: #define __UINT32_TYPE__ unsigned int
+// LA64: #define __UINT64_C_SUFFIX__ UL
+// LA64: #define __UINT64_FMTX__ "lX"
+// LA64: #define __UINT64_FMTo__ "lo"
+// LA64: #define __UINT64_FMTu__ "lu"
+// LA64: #define __UINT64_FMTx__ "lx"
+// LA64: #define __UINT64_MAX__ 18446744073709551615UL
+// LA64: #define __UINT64_TYPE__ long unsigned int
+// LA64: #define __UINT8_C_SUFFIX__
+// LA64: #define __UINT8_FMTX__ "hhX"
+// LA64: #define __UINT8_FMTo__ "hho"
+// LA64: #define __UINT8_FMTu__ "hhu"
+// LA64: #define __UINT8_FMTx__ "hhx"
+// LA64: #define __UINT8_MAX__ 255
+// LA64: #define __UINT8_TYPE__ unsigned char
+// LA64: #define __UINTMAX_C_SUFFIX__ UL
+// LA64: #define __UINTMAX_FMTX__ "lX"
+// LA64: #define __UINTMAX_FMTo__ "lo"
+// LA64: #define __UINTMAX_FMTu__ "lu"
+// LA64: #define __UINTMAX_FMTx__ "lx"
+// LA64: #define __UINTMAX_MAX__ 18446744073709551615UL
+// LA64: #define __UINTMAX_TYPE__ long unsigned int
+// LA64: #define __UINTMAX_WIDTH__ 64
+// LA64: #define __UINTPTR_FMTX__ "lX"
+// LA64: #define __UINTPTR_FMTo__ "lo"
+// LA64: #define __UINTPTR_FMTu__ "lu"
+// LA64: #define __UINTPTR_FMTx__ "lx"
+// LA64: #define __UINTPTR_MAX__ 18446744073709551615UL
+// LA64: #define __UINTPTR_TYPE__ long unsigned int
+// LA64: #define __UINTPTR_WIDTH__ 64
+// LA64: #define __UINT_FAST16_FMTX__ "hX"
+// LA64: #define __UINT_FAST16_FMTo__ "ho"
+// LA64: #define __UINT_FAST16_FMTu__ "hu"
+// LA64: #define __UINT_FAST16_FMTx__ "hx"
+// LA64: #define __UINT_FAST16_MAX__ 65535
+// TODO: LoongArch GCC defines UINT_FAST16 to be long unsigned int
+// LA64: #define __UINT_FAST16_TYPE__ unsigned short
+// LA64: #define __UINT_FAST32_FMTX__ "X"
+// LA64: #define __UINT_FAST32_FMTo__ "o"
+// LA64: #define __UINT_FAST32_FMTu__ "u"
+// LA64: #define __UINT_FAST32_FMTx__ "x"
+// LA64: #define __UINT_FAST32_MAX__ 4294967295U
+// LA64: #define __UINT_FAST32_TYPE__ unsigned int
+// LA64: #define __UINT_FAST64_FMTX__ "lX"
+// LA64: #define __UINT_FAST64_FMTo__ "lo"
+// LA64: #define __UINT_FAST64_FMTu__ "lu"
+// LA64: #define __UINT_FAST64_FMTx__ "lx"
+// LA64: #define __UINT_FAST64_MAX__ 18446744073709551615UL
+// LA64: #define __UINT_FAST64_TYPE__ long unsigned int
+// LA64: #define __UINT_FAST8_FMTX__ "hhX"
+// LA64: #define __UINT_FAST8_FMTo__ "hho"
+// LA64: #define __UINT_FAST8_FMTu__ "hhu"
+// LA64: #define __UINT_FAST8_FMTx__ "hhx"
+// LA64: #define __UINT_FAST8_MAX__ 255
+// LA64: #define __UINT_FAST8_TYPE__ unsigned char
+// LA64: #define __UINT_LEAST16_FMTX__ "hX"
+// LA64: #define __UINT_LEAST16_FMTo__ "ho"
+// LA64: #define __UINT_LEAST16_FMTu__ "hu"
+// LA64: #define __UINT_LEAST16_FMTx__ "hx"
+// LA64: #define __UINT_LEAST16_MAX__ 65535
+// LA64: #define __UINT_LEAST16_TYPE__ unsigned short
+// LA64: #define __UINT_LEAST32_FMTX__ "X"
+// LA64: #define __UINT_LEAST32_FMTo__ "o"
+// LA64: #define __UINT_LEAST32_FMTu__ "u"
+// LA64: #define __UINT_LEAST32_FMTx__ "x"
+// LA64: #define __UINT_LEAST32_MAX__ 4294967295U
+// LA64: #define __UINT_LEAST32_TYPE__ unsigned int
+// LA64: #define __UINT_LEAST64_FMTX__ "lX"
+// LA64: #define __UINT_LEAST64_FMTo__ "lo"
+// LA64: #define __UINT_LEAST64_FMTu__ "lu"
+// LA64: #define __UINT_LEAST64_FMTx__ "lx"
+// LA64: #define __UINT_LEAST64_MAX__ 18446744073709551615UL
+// LA64: #define __UINT_LEAST64_TYPE__ long unsigned int
+// LA64: #define __UINT_LEAST8_FMTX__ "hhX"
+// LA64: #define __UINT_LEAST8_FMTo__ "hho"
+// LA64: #define __UINT_LEAST8_FMTu__ "hhu"
+// LA64: #define __UINT_LEAST8_FMTx__ "hhx"
+// LA64: #define __UINT_LEAST8_MAX__ 255
+// LA64: #define __UINT_LEAST8_TYPE__ unsigned char
+// LA64: #define __USER_LABEL_PREFIX__
+// LA64: #define __WCHAR_MAX__ 2147483647
+// LA64: #define __WCHAR_TYPE__ int
+// LA64: #define __WCHAR_WIDTH__ 32
+// LA64: #define __WINT_MAX__ 4294967295U
+// LA64: #define __WINT_TYPE__ unsigned int
+// LA64: #define __WINT_UNSIGNED__ 1
+// LA64: #define __WINT_WIDTH__ 32
+// LA64-LINUX: #define __gnu_linux__ 1
+// LA64-LINUX: #define __linux 1
+// LA64-LINUX: #define __linux__ 1
+// LA64: #define __loongarch__ 1
+// LA64-LINUX: #define __unix 1
+// LA64-LINUX: #define __unix__ 1
+// LA64-LINUX: #define linux 1
+// LA64-LINUX: #define unix 1


        


More information about the cfe-commits mailing list