67 lines
1.9 KiB
C++
67 lines
1.9 KiB
C++
/* -*- C++ -*-
|
|
* Serene Programming Language
|
|
*
|
|
* Copyright (c) 2019-2022 Sameer Rahmani <lxsameer@gnu.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, version 2.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef SERENE_JIT_PACKER_H
|
|
#define SERENE_JIT_PACKER_H
|
|
|
|
#include <llvm/ADT/SmallVector.h>
|
|
#include <llvm/ADT/StringRef.h>
|
|
#include <llvm/IR/Module.h>
|
|
|
|
namespace serene::jit {
|
|
|
|
struct Packer {
|
|
/// Trait that defines how a given type is passed to the JIT code. This
|
|
/// defaults to passing the address but can be specialized.
|
|
template <typename T>
|
|
struct Argument {
|
|
static void pack(llvm::SmallVectorImpl<void *> &args, T &val) {
|
|
args.push_back(&val);
|
|
}
|
|
};
|
|
|
|
/// Tag to wrap an output parameter when invoking a jitted function.
|
|
template <typename T>
|
|
struct FnResult {
|
|
explicit FnResult(T &result) : value(result) {}
|
|
T &value;
|
|
};
|
|
|
|
/// Helper function to wrap an output operand when using
|
|
/// ExecutionEngine::invoke.
|
|
template <typename T>
|
|
static FnResult<T> result(T &t) {
|
|
return FnResult<T>(t);
|
|
}
|
|
|
|
// Specialization for output parameter: their address is forwarded directly to
|
|
// the native code.
|
|
template <typename T>
|
|
struct Argument<FnResult<T>> {
|
|
static void pack(llvm::SmallVectorImpl<void *> &args, FnResult<T> &result) {
|
|
args.push_back(&result.value);
|
|
}
|
|
};
|
|
};
|
|
|
|
std::string makePackedFunctionName(llvm::StringRef name);
|
|
void packFunctionArguments(llvm::Module *module);
|
|
|
|
} // namespace serene::jit
|
|
#endif
|