From 0ee50837eb19cf64ef9c495ad0ca7900d6437b9f Mon Sep 17 00:00:00 2001 From: Nandor Licker Date: Mon, 2 Sep 2019 10:38:08 +0000 Subject: [PATCH] [Clang Interpreter] Initial patch for the constexpr interpreter 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@370636 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/MathExtras.h | 4 -- utils/gn/secondary/clang/lib/AST/BUILD.gn | 1 + .../secondary/clang/lib/AST/Interp/BUILD.gn | 39 +++++++++++++++++++ .../secondary/clang/utils/TableGen/BUILD.gn | 1 + 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 utils/gn/secondary/clang/lib/AST/Interp/BUILD.gn diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index f97841eba1c..b4abb0e50cd 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -902,9 +902,6 @@ SubOverflow(T X, T Y, T &Result) { template typename std::enable_if::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::type; const U UX = X < 0 ? (0 - static_cast(X)) : static_cast(X); @@ -926,7 +923,6 @@ MulOverflow(T X, T Y, T &Result) { return UX > (static_cast(std::numeric_limits::max()) + U(1)) / UY; else return UX > (static_cast(std::numeric_limits::max())) / UY; -#endif } } // End llvm namespace diff --git a/utils/gn/secondary/clang/lib/AST/BUILD.gn b/utils/gn/secondary/clang/lib/AST/BUILD.gn index 9d72b38bd23..c98910691ab 100644 --- a/utils/gn/secondary/clang/lib/AST/BUILD.gn +++ b/utils/gn/secondary/clang/lib/AST/BUILD.gn @@ -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 index 00000000000..5a84d37847f --- /dev/null +++ b/utils/gn/secondary/clang/lib/AST/Interp/BUILD.gn @@ -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", + ] +} diff --git a/utils/gn/secondary/clang/utils/TableGen/BUILD.gn b/utils/gn/secondary/clang/utils/TableGen/BUILD.gn index 9a81b79da10..46af9052b97 100644 --- a/utils/gn/secondary/clang/utils/TableGen/BUILD.gn +++ b/utils/gn/secondary/clang/utils/TableGen/BUILD.gn @@ -14,6 +14,7 @@ executable("clang-tblgen") { "ClangOpenCLBuiltinEmitter.cpp", "ClangOptionDocEmitter.cpp", "ClangSACheckersEmitter.cpp", + "ClangOpcodesEmitter.cpp", "NeonEmitter.cpp", "TableGen.cpp", ] -- 2.50.1