mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
b6c9039962
The GenericLLVMIRPlatformSupport class runs a transform on all LLVM IR added to the LLJIT instance to replace instances of llvm.global_ctors with a specially named function that runs the corresponing static initializers (See (GlobalCtorDtorScraper from lib/ExecutionEngine/Orc/LLJIT.cpp). This patch updates the GenericIRPlatform class to check for this specially named function in other materialization units that are added to the JIT and, if found, add the function to the initializer work queue. Doing this allows object files that were compiled from IR and cached to be reloaded in subsequent JIT sessions without their initializers being skipped. To enable testing this patch also updates the lli tool's -jit-kind=orc-lazy mode to respect the -enable-cache-manager and -object-cache-dir options, and modifies the CompileOnDemandLayer to rename extracted submodules to include a hash of the names of their symbol definitions. This allows a simple object caching scheme based on module names (which was already implemented in lli) to work with the lazy JIT.
29 lines
964 B
LLVM
29 lines
964 B
LLVM
; RUN: rm -rf %t
|
|
; RUN: mkdir -p %t
|
|
; RUN: lli -jit-kind=orc-lazy -enable-cache-manager -object-cache-dir=%t %s
|
|
; RUN: lli -jit-kind=orc-lazy -enable-cache-manager -object-cache-dir=%t %s
|
|
;
|
|
; Verify that LLJIT Platforms respect static initializers in cached objects.
|
|
; This IR file contains a static initializer that must execute for main to exit
|
|
; with value zero. The first execution will populate an object cache for the
|
|
; second. The initializer in the cached objects must also be successfully run
|
|
; for the test to pass.
|
|
|
|
@HasError = global i8 1, align 1
|
|
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @resetHasError, i8* null }]
|
|
|
|
define void @resetHasError() {
|
|
entry:
|
|
store i8 0, i8* @HasError, align 1
|
|
ret void
|
|
}
|
|
|
|
define i32 @main(i32 %argc, i8** %argv) #2 {
|
|
entry:
|
|
%0 = load i8, i8* @HasError, align 1
|
|
%tobool = trunc i8 %0 to i1
|
|
%conv = zext i1 %tobool to i32
|
|
ret i32 %conv
|
|
}
|
|
|