]> granicus.if.org Git - llvm/commitdiff
[Clang Interpreter] Initial patch for the constexpr interpreter
authorNandor Licker <n@ndor.email>
Wed, 4 Sep 2019 05:49:41 +0000 (05:49 +0000)
committerNandor Licker <n@ndor.email>
Wed, 4 Sep 2019 05:49:41 +0000 (05:49 +0000)
Summary:
This patch introduces the skeleton of the constexpr interpreter,
capable of evaluating a simple constexpr functions consisting of
if statements. The interpreter is described in more detail in the
RFC. Further patches will add more features.

Reviewers: Bigcheese, jfb, rsmith

Subscribers: bruno, uenoku, ldionne, Tyker, thegameg, tschuett, dexonsmith, mgorny, cfe-commits

Tags: #clang

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@370839 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/MathExtras.h
utils/gn/secondary/clang/lib/AST/BUILD.gn
utils/gn/secondary/clang/lib/AST/Interp/BUILD.gn [new file with mode: 0644]
utils/gn/secondary/clang/utils/TableGen/BUILD.gn

index f97841eba1c9610357d2ed502a50ee254081b798..b4abb0e50cd42563464c67ca0303021e37862667 100644 (file)
@@ -902,9 +902,6 @@ SubOverflow(T X, T Y, T &Result) {
 template <typename T>
 typename std::enable_if<std::is_signed<T>::value, T>::type
 MulOverflow(T X, T Y, T &Result) {
-#if __has_builtin(__builtin_mul_overflow)
-  return __builtin_mul_overflow(X, Y, &Result);
-#else
   // Perform the unsigned multiplication on absolute values.
   using U = typename std::make_unsigned<T>::type;
   const U UX = X < 0 ? (0 - static_cast<U>(X)) : static_cast<U>(X);
@@ -926,7 +923,6 @@ MulOverflow(T X, T Y, T &Result) {
     return UX > (static_cast<U>(std::numeric_limits<T>::max()) + U(1)) / UY;
   else
     return UX > (static_cast<U>(std::numeric_limits<T>::max())) / UY;
-#endif
 }
 
 } // End llvm namespace
index 9d72b38bd2361eed382e699d01a853d36f24a5b9..c98910691abec8d858b0cc007b38e3ef79afad64 100644 (file)
@@ -10,6 +10,7 @@ static_library("AST") {
     "//clang/include/clang/AST:CommentHTMLTags",
     "//clang/include/clang/AST:CommentHTMLTagsProperties",
     "//clang/include/clang/AST:DeclNodes",
+    "//clang/lib/AST/Interp",
     "//clang/lib/Basic",
     "//clang/lib/Lex",
     "//llvm/lib/BinaryFormat",
diff --git a/utils/gn/secondary/clang/lib/AST/Interp/BUILD.gn b/utils/gn/secondary/clang/lib/AST/Interp/BUILD.gn
new file mode 100644 (file)
index 0000000..5a84d37
--- /dev/null
@@ -0,0 +1,39 @@
+import("//clang/utils/TableGen/clang_tablegen.gni")
+
+clang_tablegen("Opcodes") {
+  args = [ "-gen-clang-opcodes" ]
+  td_file = "Opcodes.td"
+}
+
+static_library("Interp") {
+  output_name = "clangInterp"
+  configs += [ "//llvm/utils/gn/build:clang_code" ]
+  deps = [
+    "//clang/lib/AST/Interp:Opcodes",
+    "//clang/lib/Basic",
+    "//llvm/lib/Support",
+  ]
+  sources = [
+    "Block.cpp",
+    "ByteCodeEmitter.cpp",
+    "ByteCodeExprGen.cpp",
+    "ByteCodeGenError.cpp",
+    "ByteCodeStmtGen.cpp",
+    "Context.cpp",
+    "Descriptor.cpp",
+    "Disasm.cpp",
+    "EvalEmitter.cpp",
+    "Frame.cpp",
+    "Function.cpp",
+    "Interp.cpp",
+    "InterpFrame.cpp",
+    "InterpStack.cpp",
+    "InterpState.cpp",
+    "Pointer.cpp",
+    "Program.cpp",
+    "Record.cpp",
+    "Source.cpp",
+    "State.cpp",
+    "Type.cpp",
+  ]
+}
index 9a81b79da10a1c229d91699aa55ace3005049ff7..46af9052b97429ba6610987aa9584a5f049cb571 100644 (file)
@@ -14,6 +14,7 @@ executable("clang-tblgen") {
     "ClangOpenCLBuiltinEmitter.cpp",
     "ClangOptionDocEmitter.cpp",
     "ClangSACheckersEmitter.cpp",
+    "ClangOpcodesEmitter.cpp",
     "NeonEmitter.cpp",
     "TableGen.cpp",
   ]