From: Nandor Licker Date: Fri, 13 Sep 2019 09:46:16 +0000 (+0000) Subject: [Clang Interpreter] Initial patch for the constexpr interpreter X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=70adb95bf9e0d2e85c591d2cfd8a3b832af24386;p=llvm [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@371834 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index 869d4136110..775d19a698f 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -895,9 +895,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); @@ -919,7 +916,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", ]