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
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);
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
"//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",
--- /dev/null
+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",
+ ]
+}
"ClangOpenCLBuiltinEmitter.cpp",
"ClangOptionDocEmitter.cpp",
"ClangSACheckersEmitter.cpp",
+ "ClangOpcodesEmitter.cpp",
"NeonEmitter.cpp",
"TableGen.cpp",
]