mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-08 03:58:42 +00:00
57004ae3ac
This index record the position for each metadata record in the bitcode, so that the reader will be able to lazy-load on demand each individual record. We also make sure that every abbrev is emitted upfront so that the block can be skipped while reading. I don't plan to commit this before having the reader counterpart, but I figured this can be reviewed mostly independently. Recommit r290684 (was reverted in r290686 because a test was broken) after adding a threshold to avoid emitting the index when unnecessary (little amount of metadata). This optimization "hides" a limitation of the ability to backpatch in the bitstream: we can only backpatch safely when the position has been flushed. So if we emit an index for one metadata, it is possible that (part of) the offset placeholder hasn't been flushed and the backpatch will fail. Differential Revision: https://reviews.llvm.org/D28083 llvm-svn: 290690
79 lines
2.2 KiB
LLVM
79 lines
2.2 KiB
LLVM
; RUN: llvm-as < %s -bitcode-mdindex-threshold=0 | llvm-bcanalyzer -dump | FileCheck %s
|
|
; Test that metadata only used by a single function is serialized in that
|
|
; function instead of in the global pool.
|
|
;
|
|
; In order to make the bitcode records easy to follow, nodes in this testcase
|
|
; are named after the ids they are given in the bitcode. Nodes local to a
|
|
; function have offsets of 100 or 200 (depending on the function) so that they
|
|
; remain unique within this textual IR.
|
|
|
|
; Check for strings in the global pool.
|
|
; CHECK: <METADATA_BLOCK
|
|
; CHECK-NEXT: <STRINGS
|
|
; CHECK-SAME: /> num-strings = 3 {
|
|
; CHECK-NEXT: 'named'
|
|
; CHECK-NEXT: 'named and foo'
|
|
; CHECK-NEXT: 'foo and bar'
|
|
; CHECK-NEXT: }
|
|
|
|
; Each node gets a new number. Bottom-up traversal of nodes.
|
|
!named = !{!6}
|
|
|
|
; Before the records we emit an offset to the index for the block
|
|
; CHECK-NEXT: <INDEX_OFFSET
|
|
|
|
; CHECK-NEXT: <NODE op0=1/>
|
|
!4 = !{!"named"}
|
|
|
|
; CHECK-NEXT: <NODE op0=2/>
|
|
!5 = !{!"named and foo"}
|
|
|
|
; CHECK-NEXT: <NODE op0=1 op1=4 op2=5/>
|
|
!6 = !{!"named", !4, !5}
|
|
|
|
; CHECK-NEXT: <NODE op0=3/>
|
|
!7 = !{!"foo and bar"}
|
|
|
|
; CHECK-NOT: <NODE
|
|
; CHECK: </METADATA_BLOCK
|
|
|
|
; Look at metadata local to @foo, starting with strings.
|
|
; CHECK: <FUNCTION_BLOCK
|
|
; CHECK: <METADATA_BLOCK
|
|
; CHECK-NEXT: <STRINGS
|
|
; CHECK-SAME: /> num-strings = 1 {
|
|
; CHECK-NEXT: 'foo'
|
|
; CHECK-NEXT: }
|
|
|
|
; Function-local nodes start at 9 (strings at 8).
|
|
; CHECK-NEXT: <NODE op0=8/>
|
|
!109 = !{!"foo"}
|
|
|
|
; CHECK-NEXT: <NODE op0=8 op1=3 op2=9 op3=7 op4=5/>
|
|
!110 = !{!"foo", !"foo and bar", !109, !7, !5}
|
|
|
|
; CHECK-NEXT: </METADATA_BLOCK
|
|
define void @foo() !foo !110 {
|
|
unreachable
|
|
}
|
|
|
|
; Look at metadata local to @bar, starting with strings.
|
|
; CHECK: <FUNCTION_BLOCK
|
|
; CHECK: <METADATA_BLOCK
|
|
; CHECK-NEXT: <STRINGS
|
|
; CHECK-SAME: /> num-strings = 1 {
|
|
; CHECK-NEXT: 'bar'
|
|
; CHECK-NEXT: }
|
|
|
|
; Function-local nodes start at 9 (strings at 8).
|
|
; CHECK-NEXT: <NODE op0=8/>
|
|
!209 = !{!"bar"}
|
|
|
|
; CHECK-NEXT: <NODE op0=8 op1=3 op2=9 op3=7/>
|
|
!210 = !{!"bar", !"foo and bar", !209, !7}
|
|
|
|
; CHECK-NEXT: </METADATA_BLOCK
|
|
define void @bar() {
|
|
unreachable, !bar !210
|
|
}
|