Files
clang-p2996/llvm/examples/OrcV2Examples/LLJITWithInitializers/LLJITWithInitializers.cpp
Lang Hames 8b1771bd9f [ORC] Move most ORC APIs to ExecutorAddr, introduce ExecutorSymbolDef.
ExecutorAddr was introduced in b8e5f91816 as an eventual replacement for
JITTargetAddress. ExecutorSymbolDef is introduced in this patch as a
replacement for JITEvaluatedSymbol: ExecutorSymbolDef is an (ExecutorAddr,
JITSymbolFlags) pair, where JITEvaluatedSymbol was a (JITTargetAddress,
JITSymbolFlags) pair.

A number of APIs had already migrated from JITTargetAddress to ExecutorAddr,
but many of ORC's internals were still using the older type. This patch aims
to address that.

Some public APIs are affected as well. If you need to migrate your APIs you can
use the following operations:

* ExecutorAddr::toPtr replaces jitTargetAddressToPointer and
  jitTargetAddressToFunction.

* ExecutorAddr::fromPtr replace pointerToJITTargetAddress.

* ExecutorAddr(JITTargetAddress) creates an ExecutorAddr value from a
  JITTargetAddress.

* ExecutorAddr::getValue() creates a JITTargetAddress value from an
  ExecutorAddr.

JITTargetAddress and JITEvaluatedSymbol will remain in JITSymbol.h for now, but
the aim will be to eventually deprecate and remove these types (probably when
MCJIT and RuntimeDyld are deprecated).
2023-03-27 17:37:58 -07:00

100 lines
3.0 KiB
C++

//===----- LLJITDumpObjects.cpp - How to dump JIT'd objects with LLJIT ----===//
//
// 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
//
//===----------------------------------------------------------------------===//
///
/// \file
///
/// This example demonstrates how to use LLJIT to:
/// - Add absolute symbol definitions.
/// - Run static constructors for a JITDylib.
/// - Run static destructors for a JITDylib.
///
/// This example does not call any functions (e.g. main or equivalent) between
/// running the static constructors and running the static destructors.
///
//===----------------------------------------------------------------------===//
#include "llvm/ADT/StringMap.h"
#include "llvm/ExecutionEngine/Orc/LLJIT.h"
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/raw_ostream.h"
#include "../ExampleModules.h"
using namespace llvm;
using namespace llvm::orc;
ExitOnError ExitOnErr;
const llvm::StringRef ModuleWithInitializer =
R"(
@InitializersRunFlag = external global i32
@DeinitializersRunFlag = external global i32
declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*)
@__dso_handle = external hidden global i8
@llvm.global_ctors =
appending global [1 x { i32, void ()*, i8* }]
[{ i32, void ()*, i8* } { i32 65535, void ()* @init_func, i8* null }]
define internal void @init_func() {
entry:
store i32 1, i32* @InitializersRunFlag
%0 = call i32 @__cxa_atexit(void (i8*)* @deinit_func, i8* null,
i8* @__dso_handle)
ret void
}
define internal void @deinit_func(i8* %0) {
store i32 1, i32* @DeinitializersRunFlag
ret void
}
)";
int main(int argc, char *argv[]) {
// Initialize LLVM.
InitLLVM X(argc, argv);
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
cl::ParseCommandLineOptions(argc, argv, "LLJITWithInitializers");
ExitOnErr.setBanner(std::string(argv[0]) + ": ");
auto J = ExitOnErr(LLJITBuilder().create());
auto M = ExitOnErr(parseExampleModule(ModuleWithInitializer, "M"));
// Load the module.
ExitOnErr(J->addIRModule(std::move(M)));
int32_t InitializersRunFlag = 0;
int32_t DeinitializersRunFlag = 0;
ExitOnErr(J->getMainJITDylib().define(
absoluteSymbols({{J->mangleAndIntern("InitializersRunFlag"),
{ExecutorAddr::fromPtr(&InitializersRunFlag),
JITSymbolFlags::Exported}},
{J->mangleAndIntern("DeinitializersRunFlag"),
{ExecutorAddr::fromPtr(&DeinitializersRunFlag),
JITSymbolFlags::Exported}}})));
// Run static initializers.
ExitOnErr(J->initialize(J->getMainJITDylib()));
// Run deinitializers.
ExitOnErr(J->deinitialize(J->getMainJITDylib()));
outs() << "InitializerRanFlag = " << InitializersRunFlag << "\n"
<< "DeinitializersRunFlag = " << DeinitializersRunFlag << "\n";
return 0;
}