mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
cfe7d6c196
The basic idea of the pass is to use a circular buffer to log the execution ordering of the functions. We only log the function when it is first executed. We use a 8-byte hash to log the function symbol name. In this pass, we add three global variables: (1) an order file buffer: a circular buffer at its own llvm section. (2) a bitmap for each module: one byte for each function to say if the function is already executed. (3) a global index to the order file buffer. At the function prologue, if the function has not been executed (by checking the bitmap), log the function hash, then atomically increase the index. Differential Revision: https://reviews.llvm.org/D57463 llvm-svn: 355133
25 lines
1.0 KiB
LLVM
25 lines
1.0 KiB
LLVM
; RUN: opt -instrorderfile -S < %s | FileCheck %s
|
|
; RUN: opt -passes=instrorderfile -S < %s | FileCheck %s
|
|
|
|
target triple = "x86_64-apple-macosx10.10.0"
|
|
|
|
; CHECK: @_llvm_order_file_buffer ={{.*}}global [131072 x i64] zeroinitializer
|
|
; CHECK: @_llvm_order_file_buffer_idx = linkonce_odr global i32 0
|
|
; CHECK: @bitmap_0 ={{.*}}global [1 x i8] zeroinitializer
|
|
|
|
define i32 @_Z1fv() {
|
|
ret i32 0
|
|
}
|
|
; CHECK-LABEL: define i32 @_Z1fv
|
|
; CHECK: order_file_entry
|
|
; CHECK: %[[T1:.+]] = load i8, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @bitmap_0, i32 0, i32 0
|
|
; CHECK: store i8 1, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @bitmap_0, i32 0, i32 0)
|
|
; CHECK: %[[T2:.+]] = icmp eq i8 %[[T1]], 0
|
|
; CHECK: br i1 %[[T2]], label %order_file_set, label
|
|
|
|
; CHECK: order_file_set
|
|
; CHECK: %[[T3:.+]] = atomicrmw add i32* @_llvm_order_file_buffer_idx, i32 1 seq_cst
|
|
; CHECK: %[[T5:.+]] = and i32 %[[T3]], 131071
|
|
; CHECK: %[[T4:.+]] = getelementptr [131072 x i64], [131072 x i64]* @_llvm_order_file_buffer, i32 0, i32 %[[T5]]
|
|
; CHECK: store i64 {{.*}}, i64* %[[T4]]
|