mgrang created this revision.
mgrang added reviewers: asb, kito-cheng, apazos.
Herald added subscribers: cfe-commits, niosHD, sabuasal, jordy.potman.lists, 
simoncook, johnrusso, rbar, aheejin, jgravelle-google, sbc100, sdardis, 
dschuff, jfb.

If the flag -fuse-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.


Repository:
  rC Clang

https://reviews.llvm.org/D43105

Files:
  include/clang/Basic/LangOptions.def
  include/clang/Basic/TargetInfo.h
  include/clang/Driver/Options.td
  lib/Basic/Targets/Mips.h
  lib/Basic/Targets/RISCV.h
  lib/Basic/Targets/WebAssembly.h
  lib/Basic/Targets/X86.h
  lib/CodeGen/SwiftCallingConv.cpp
  lib/Driver/ToolChains/Clang.cpp
  lib/Frontend/CompilerInvocation.cpp
  lib/Frontend/InitPreprocessor.cpp
  lib/Sema/Sema.cpp
  lib/Sema/SemaOverload.cpp
  lib/Sema/SemaType.cpp
  test/Driver/types.c

Index: test/Driver/types.c
===================================================================
--- /dev/null
+++ test/Driver/types.c
@@ -0,0 +1,14 @@
+// Check whether __int128_t and __uint128_t are supported.
+
+// RUN: not %clang -c --target=riscv32-unknown-linux-gnu %s \
+// RUN: 2>&1 | FileCheck %s
+
+// RUN: %clang -c --target=riscv32-unknown-linux-gnu %s -fuse-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'
Index: lib/Sema/SemaType.cpp
===================================================================
--- lib/Sema/SemaType.cpp
+++ lib/Sema/SemaType.cpp
@@ -1385,7 +1385,7 @@
     break;
   }
   case DeclSpec::TST_int128:
-    if (!S.Context.getTargetInfo().hasInt128Type())
+    if (!S.Context.getTargetInfo().hasInt128Type(S.getLangOpts()))
       S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported)
         << "__int128";
     if (DS.getTypeSpecSign() == DeclSpec::TSS_unsigned)
Index: lib/Sema/SemaOverload.cpp
===================================================================
--- lib/Sema/SemaOverload.cpp
+++ lib/Sema/SemaOverload.cpp
@@ -7680,12 +7680,12 @@
     ArithmeticTypes.push_back(S.Context.IntTy);
     ArithmeticTypes.push_back(S.Context.LongTy);
     ArithmeticTypes.push_back(S.Context.LongLongTy);
-    if (S.Context.getTargetInfo().hasInt128Type())
+    if (S.Context.getTargetInfo().hasInt128Type(S.getLangOpts()))
       ArithmeticTypes.push_back(S.Context.Int128Ty);
     ArithmeticTypes.push_back(S.Context.UnsignedIntTy);
     ArithmeticTypes.push_back(S.Context.UnsignedLongTy);
     ArithmeticTypes.push_back(S.Context.UnsignedLongLongTy);
-    if (S.Context.getTargetInfo().hasInt128Type())
+    if (S.Context.getTargetInfo().hasInt128Type(S.getLangOpts()))
       ArithmeticTypes.push_back(S.Context.UnsignedInt128Ty);
     LastPromotedIntegralType = ArithmeticTypes.size();
     LastPromotedArithmeticType = ArithmeticTypes.size();
Index: lib/Sema/Sema.cpp
===================================================================
--- lib/Sema/Sema.cpp
+++ lib/Sema/Sema.cpp
@@ -196,7 +196,7 @@
     return;
 
   // Initialize predefined 128-bit integer types, if needed.
-  if (Context.getTargetInfo().hasInt128Type()) {
+  if (Context.getTargetInfo().hasInt128Type(getLangOpts())) {
     // If either of the 128-bit integer types are unavailable to name lookup,
     // define them now.
     DeclarationName Int128 = &Context.Idents.get("__int128_t");
Index: lib/Frontend/InitPreprocessor.cpp
===================================================================
--- lib/Frontend/InitPreprocessor.cpp
+++ lib/Frontend/InitPreprocessor.cpp
@@ -778,7 +778,7 @@
                    TI.getTypeWidth(TI.getWCharType()), TI, Builder);
   DefineTypeSizeof("__SIZEOF_WINT_T__",
                    TI.getTypeWidth(TI.getWIntType()), TI, Builder);
-  if (TI.hasInt128Type())
+  if (TI.hasInt128Type(LangOpts))
     DefineTypeSizeof("__SIZEOF_INT128__", 128, TI, Builder);
 
   DefineType("__INTMAX_TYPE__", TI.getIntMaxType(), Builder);
@@ -1048,7 +1048,7 @@
       Builder.defineMacro("__IMAGE_SUPPORT__");
   }
 
-  if (TI.hasInt128Type() && LangOpts.CPlusPlus && LangOpts.GNUMode) {
+  if (TI.hasInt128Type(LangOpts) && LangOpts.CPlusPlus && LangOpts.GNUMode) {
     // For each extended integer type, g++ defines a macro mapping the
     // index of the type (0 in this case) in some list of extended types
     // to the type.
Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -2343,6 +2343,7 @@
   Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns)
                             | Opts.NativeHalfArgsAndReturns;
   Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);
+  Opts.UseInt128 = Args.hasArg(OPT_fuse_int128);
 
   // __declspec is enabled by default for the PS4 by the driver, and also
   // enabled for Microsoft Extensions or Borland Extensions, here.
Index: lib/Driver/ToolChains/Clang.cpp
===================================================================
--- lib/Driver/ToolChains/Clang.cpp
+++ lib/Driver/ToolChains/Clang.cpp
@@ -1705,6 +1705,11 @@
 
   CmdArgs.push_back("-target-abi");
   CmdArgs.push_back(ABIName);
+
+  if (Triple.getArch() == llvm::Triple::riscv32) {
+    if (Args.hasArg(options::OPT_fuse_int128))
+      CmdArgs.push_back("-fuse-int128");
+  }
 }
 
 void Clang::AddSparcTargetArgs(const ArgList &Args,
Index: lib/CodeGen/SwiftCallingConv.cpp
===================================================================
--- lib/CodeGen/SwiftCallingConv.cpp
+++ lib/CodeGen/SwiftCallingConv.cpp
@@ -632,7 +632,8 @@
     return true;
 
   case 128:
-    return CGM.getContext().getTargetInfo().hasInt128Type();
+    return CGM.getContext().getTargetInfo().hasInt128Type(
+             CGM.getContext().getLangOpts());
 
   default:
     return false;
Index: lib/Basic/Targets/X86.h
===================================================================
--- lib/Basic/Targets/X86.h
+++ lib/Basic/Targets/X86.h
@@ -637,7 +637,7 @@
   }
 
   // for x32 we need it here explicitly
-  bool hasInt128Type() const override { return true; }
+  bool hasInt128Type(const LangOptions &Opts) const override { return true; }
 
   unsigned getUnwindWordWidth() const override { return 64; }
   
Index: lib/Basic/Targets/WebAssembly.h
===================================================================
--- lib/Basic/Targets/WebAssembly.h
+++ lib/Basic/Targets/WebAssembly.h
@@ -98,7 +98,7 @@
 
   bool isCLZForZeroUndef() const final { return false; }
 
-  bool hasInt128Type() const final { return true; }
+  bool hasInt128Type(const LangOptions &Opts) const final { return true; }
 
   IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
     // WebAssembly prefers long long for explicitly 64-bit integers.
Index: lib/Basic/Targets/RISCV.h
===================================================================
--- lib/Basic/Targets/RISCV.h
+++ lib/Basic/Targets/RISCV.h
@@ -14,6 +14,7 @@
 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_RISCV_H
 #define LLVM_CLANG_LIB_BASIC_TARGETS_RISCV_H
 
+#include "Targets.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Basic/TargetOptions.h"
 #include "llvm/ADT/Triple.h"
@@ -60,6 +61,7 @@
     return false;
   }
 };
+
 class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo {
 public:
   RISCV32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
@@ -78,7 +80,12 @@
     }
     return false;
   }
+
+  bool hasInt128Type(const LangOptions &Opts) const override {
+    return Opts.UseInt128;
+  }
 };
+
 class LLVM_LIBRARY_VISIBILITY RISCV64TargetInfo : public RISCVTargetInfo {
 public:
   RISCV64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Index: lib/Basic/Targets/Mips.h
===================================================================
--- lib/Basic/Targets/Mips.h
+++ lib/Basic/Targets/Mips.h
@@ -387,7 +387,9 @@
     return llvm::makeArrayRef(NewABIRegAliases);
   }
 
-  bool hasInt128Type() const override { return ABI == "n32" || ABI == "n64"; }
+  bool hasInt128Type(const LangOptions &Opts) const override {
+    return ABI == "n32" || ABI == "n64";
+  }
 
   bool validateTarget(DiagnosticsEngine &Diags) const override;
 };
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -839,6 +839,8 @@
 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 fuse_int128 : Flag<["-"], "fuse-int128">, Group<f_Group>,
+  Flags<[CC1Option]>, HelpText<"Enable support for int128_t type">;
 
 // Begin sanitizer flags. These should all be core options exposed in all driver
 // modes.
Index: include/clang/Basic/TargetInfo.h
===================================================================
--- include/clang/Basic/TargetInfo.h
+++ include/clang/Basic/TargetInfo.h
@@ -357,7 +357,7 @@
   unsigned getLongLongAlign() const { return LongLongAlign; }
 
   /// \brief Determine whether the __int128 type is supported on this target.
-  virtual bool hasInt128Type() const {
+  virtual bool hasInt128Type(const LangOptions &Opts) const {
     return getPointerWidth(0) >= 64;
   } // FIXME
 
Index: include/clang/Basic/LangOptions.def
===================================================================
--- include/clang/Basic/LangOptions.def
+++ include/clang/Basic/LangOptions.def
@@ -277,6 +277,8 @@
 LANGOPT(XRayAlwaysEmitCustomEvents, 1, 0,
         "controls whether to always emit intrinsic calls to "
         "__xray_customevent(...) builtin.")
+LANGOPT(UseInt128, 1, 0, "controls whether __int128_t and __uint128_t "
+        "are supported")
 
 BENIGN_LANGOPT(AllowEditorPlaceholders, 1, 0,
                "allow editor placeholders in source")
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to