//===--- Value.h - Definition of interpreter value --------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Value is a lightweight struct that is used for carrying execution results in // clang-repl. It's a special runtime that acts like a messager between compiled // code and interpreted code. This makes it possible to exchange interesting // information between the compiled & interpreted world. // // A typical usage is like the below: // // Value V; // Interp.ParseAndExecute("int x = 42;"); // Interp.ParseAndExecute("x", &V); // V.getType(); // <-- Yields a clang::QualType. // V.getInt(); // <-- Yields 42. // // The current design is still highly experimental and nobody should rely on the // API being stable because we're hopefully going to make significant changes to // it in the relatively near future. For example, Value also intends to be used // as an exchange token for JIT support enabling remote execution on the embed // devices where the JIT infrastructure cannot fit. To support that we will need // to split the memory storage in a different place and perhaps add a resource // header is similar to intrinsics headers which have stricter performance // constraints. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_INTERPRETER_VALUE_H #define LLVM_CLANG_INTERPRETER_VALUE_H #include "llvm/Config/llvm-config.h" // for LLVM_BUILD_LLVM_DYLIB, LLVM_BUILD_SHARED_LIBS #include "llvm/Support/Compiler.h" #include <cstdint> // NOTE: Since the REPL itself could also include this runtime, extreme caution // should be taken when MAKING CHANGES to this file, especially when INCLUDE NEW // HEADERS, like <string>, <memory> and etc. (That pulls a large number of // tokens and will impact the runtime performance of the REPL) namespace llvm { class raw_ostream; } // namespace llvm namespace clang { class ASTContext; class Interpreter; class QualType; #if defined(_WIN32) // REPL_EXTERNAL_VISIBILITY are symbols that we need to be able to locate // at runtime. On Windows, this requires them to be exported from any of the // modules loaded at runtime. Marking them as dllexport achieves this; both // for DLLs (that normally export symbols as part of their interface) and for // EXEs (that normally don't export anything). // For a build with libclang-cpp.dll, this doesn't make any difference - the // functions would have been exported anyway. But for cases when these are // statically linked into an EXE, it makes sure that they're exported. #define REPL_EXTERNAL_VISIBILITY … #elif __has_attribute(visibility) #if defined(LLVM_BUILD_LLVM_DYLIB) || defined(LLVM_BUILD_SHARED_LIBS) #define REPL_EXTERNAL_VISIBILITY … #else #define REPL_EXTERNAL_VISIBILITY #endif #else #define REPL_EXTERNAL_VISIBILITY #endif #define REPL_BUILTIN_TYPES … class REPL_EXTERNAL_VISIBILITY Value { … }; template <> inline void *Value::as() const { … } } // namespace clang #endif