summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMandeep Singh Grang <mgrang@codeaurora.org>2018-02-25 03:58:23 +0000
committerMandeep Singh Grang <mgrang@codeaurora.org>2018-02-25 03:58:23 +0000
commit40332b100c42439e8e2c800f7d8d5456b087616b (patch)
tree308991a70b87481825d8d16a4f9321257db6e4b2
parent7234e8f0a4cb3139903e71a944c4369ec65d4b35 (diff)
[RISCV] Enable __int128_t and __uint128_t through clang flag
Summary: If the flag -fforce-enable-int128 is passed, it will enable support for __int128_t and __uint128_t types. This flag can then be used to build compiler-rt for RISCV32. Reviewers: asb, kito-cheng, apazos, efriedma Reviewed By: asb, efriedma Subscribers: shiva0217, efriedma, jfb, dschuff, sdardis, sbc100, jgravelle-google, aheejin, rbar, johnrusso, simoncook, jordy.potman.lists, sabuasal, niosHD, cfe-commits Differential Revision: https://reviews.llvm.org/D43105 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326045 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Basic/TargetInfo.h2
-rw-r--r--include/clang/Basic/TargetOptions.h3
-rw-r--r--include/clang/Driver/Options.td6
-rw-r--r--lib/Basic/Targets/Mips.h4
-rw-r--r--lib/Driver/ToolChains/Clang.cpp6
-rw-r--r--lib/Frontend/CompilerInvocation.cpp1
-rw-r--r--test/CodeGen/riscv32-abi.c7
-rw-r--r--test/Driver/types.c18
-rw-r--r--test/Preprocessor/init.c4
9 files changed, 49 insertions, 2 deletions
diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h
index ca4bbe2c39..96e51c900d 100644
--- a/include/clang/Basic/TargetInfo.h
+++ b/include/clang/Basic/TargetInfo.h
@@ -358,7 +358,7 @@ public:
/// \brief Determine whether the __int128 type is supported on this target.
virtual bool hasInt128Type() const {
- return getPointerWidth(0) >= 64;
+ return (getPointerWidth(0) >= 64) || getTargetOpts().ForceEnableInt128;
} // FIXME
/// \brief Determine whether the __float128 type is supported on this target.
diff --git a/include/clang/Basic/TargetOptions.h b/include/clang/Basic/TargetOptions.h
index 60becfb8ee..fbcba0dcbe 100644
--- a/include/clang/Basic/TargetOptions.h
+++ b/include/clang/Basic/TargetOptions.h
@@ -60,6 +60,9 @@ public:
/// \brief The list of OpenCL extensions to enable or disable, as written on
/// the command line.
std::vector<std::string> OpenCLExtensionsAsWritten;
+
+ /// \brief If given, enables support for __int128_t and __uint128_t types.
+ bool ForceEnableInt128;
};
} // end namespace clang
diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index 11baa521c3..21d42a54f8 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -849,6 +849,12 @@ def fno_signaling_math : Flag<["-"], "fno-signaling-math">, Group<f_Group>;
def fjump_tables : Flag<["-"], "fjump-tables">, Group<f_Group>;
def fno_jump_tables : Flag<["-"], "fno-jump-tables">, Group<f_Group>, Flags<[CC1Option]>,
HelpText<"Do not use jump tables for lowering switches">;
+def fforce_enable_int128 : Flag<["-"], "fforce-enable-int128">,
+ Group<f_Group>, Flags<[CC1Option]>,
+ HelpText<"Enable support for int128_t type">;
+def fno_force_enable_int128 : Flag<["-"], "fno-force-enable-int128">,
+ Group<f_Group>, Flags<[CC1Option]>,
+ HelpText<"Disable support for int128_t type">;
// Begin sanitizer flags. These should all be core options exposed in all driver
// modes.
diff --git a/lib/Basic/Targets/Mips.h b/lib/Basic/Targets/Mips.h
index 24f01866a9..ff9e790fca 100644
--- a/lib/Basic/Targets/Mips.h
+++ b/lib/Basic/Targets/Mips.h
@@ -392,7 +392,9 @@ public:
return llvm::makeArrayRef(NewABIRegAliases);
}
- bool hasInt128Type() const override { return ABI == "n32" || ABI == "n64"; }
+ bool hasInt128Type() const override {
+ return (ABI == "n32" || ABI == "n64") || getTargetOpts().ForceEnableInt128;
+ }
bool validateTarget(DiagnosticsEngine &Diags) const override;
};
diff --git a/lib/Driver/ToolChains/Clang.cpp b/lib/Driver/ToolChains/Clang.cpp
index e24164b1ce..a19c5031ce 100644
--- a/lib/Driver/ToolChains/Clang.cpp
+++ b/lib/Driver/ToolChains/Clang.cpp
@@ -4750,6 +4750,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
}
}
+ if (Arg *A = Args.getLastArg(options::OPT_fforce_enable_int128,
+ options::OPT_fno_force_enable_int128)) {
+ if (A->getOption().matches(options::OPT_fforce_enable_int128))
+ CmdArgs.push_back("-fforce-enable-int128");
+ }
+
// Finally add the compile command to the compilation.
if (Args.hasArg(options::OPT__SLASH_fallback) &&
Output.getType() == types::TY_Object &&
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 956c333937..443c550bcb 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -2781,6 +2781,7 @@ static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
if (Opts.Triple.empty())
Opts.Triple = llvm::sys::getDefaultTargetTriple();
Opts.OpenCLExtensionsAsWritten = Args.getAllArgValues(OPT_cl_ext_EQ);
+ Opts.ForceEnableInt128 = Args.hasArg(OPT_fforce_enable_int128);
}
bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
diff --git a/test/CodeGen/riscv32-abi.c b/test/CodeGen/riscv32-abi.c
index ec98e3d8db..04eceb3a81 100644
--- a/test/CodeGen/riscv32-abi.c
+++ b/test/CodeGen/riscv32-abi.c
@@ -1,4 +1,6 @@
// RUN: %clang_cc1 -triple riscv32 -emit-llvm %s -o - | FileCheck %s
+// RUN: %clang_cc1 -triple riscv32 -emit-llvm -fforce-enable-int128 %s -o - \
+// RUN: | FileCheck %s -check-prefixes=CHECK,CHECK-FORCEINT128
#include <stddef.h>
#include <stdint.h>
@@ -24,6 +26,11 @@ int32_t f_scalar_3(int32_t x) { return x; }
// CHECK-LABEL: define i64 @f_scalar_4(i64 %x)
int64_t f_scalar_4(int64_t x) { return x; }
+#ifdef __SIZEOF_INT128__
+// CHECK-FORCEINT128-LABEL: define i128 @f_scalar_5(i128 %x)
+__int128_t f_scalar_5(__int128_t x) { return x; }
+#endif
+
// CHECK-LABEL: define float @f_fp_scalar_1(float %x)
float f_fp_scalar_1(float x) { return x; }
diff --git a/test/Driver/types.c b/test/Driver/types.c
new file mode 100644
index 0000000000..03fe105ec4
--- /dev/null
+++ b/test/Driver/types.c
@@ -0,0 +1,18 @@
+// Check whether __int128_t and __uint128_t are supported.
+
+// RUN: not %clang -c --target=riscv32-unknown-linux-gnu -fsyntax-only %s \
+// RUN: 2>&1 | FileCheck %s
+
+// RUN: %clang -c --target=riscv32-unknown-linux-gnu -fsyntax-only %s \
+// RUN: -fno-force-enable-int128 -fforce-enable-int128
+
+// RUN: not %clang -c --target=riscv32-unknown-linux-gnu -fsyntax-only %s \
+// RUN: -fforce-enable-int128 -fno-force-enable-int128
+
+void a() {
+ __int128_t s;
+ __uint128_t t;
+}
+
+// CHECK: error: use of undeclared identifier '__int128_t'
+// CHECK: error: use of undeclared identifier '__uint128_t'
diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c
index 708410e552..2ed74dcf2c 100644
--- a/test/Preprocessor/init.c
+++ b/test/Preprocessor/init.c
@@ -10007,6 +10007,9 @@
// RUN: | FileCheck -match-full-lines -check-prefix=RISCV32 %s
// RUN: %clang_cc1 -E -dM -ffreestanding -triple=riscv32-unknown-linux < /dev/null \
// RUN: | FileCheck -match-full-lines -check-prefixes=RISCV32,RISCV32-LINUX %s
+// RUN: %clang_cc1 -E -dM -ffreestanding -triple=riscv32 \
+// RUN: -fforce-enable-int128 < /dev/null | FileCheck -match-full-lines \
+// RUN: -check-prefixes=RISCV32,RISCV32-INT128 %s
// RISCV32: #define _ILP32 1
// RISCV32: #define __ATOMIC_ACQUIRE 2
// RISCV32: #define __ATOMIC_ACQ_REL 4
@@ -10136,6 +10139,7 @@
// RISCV32: #define __SIG_ATOMIC_WIDTH__ 32
// RISCV32: #define __SIZEOF_DOUBLE__ 8
// RISCV32: #define __SIZEOF_FLOAT__ 4
+// RISCV32-INT128: #define __SIZEOF_INT128__ 16
// RISCV32: #define __SIZEOF_INT__ 4
// RISCV32: #define __SIZEOF_LONG_DOUBLE__ 16
// RISCV32: #define __SIZEOF_LONG_LONG__ 8