2013-07-27 01:02:41 +08:00
|
|
|
; REQUIRES: object-emission
|
|
|
|
|
2014-07-26 01:11:58 +08:00
|
|
|
; RUN: llc < %s -o %t -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu
|
2014-01-10 09:38:41 +08:00
|
|
|
; RUN: llvm-dwarfdump %t | FileCheck --check-prefix=CHECK --check-prefix=SINGLE %s
|
2014-08-27 13:04:14 +08:00
|
|
|
; RUN: llvm-readobj -s -t %t | FileCheck --check-prefix=OBJ_SINGLE %s
|
2014-01-10 09:38:41 +08:00
|
|
|
|
2014-07-26 01:11:58 +08:00
|
|
|
; RUN: llc < %s -split-dwarf=Enable -o %t -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu
|
2014-01-10 09:38:41 +08:00
|
|
|
; RUN: llvm-dwarfdump %t | FileCheck --check-prefix=CHECK --check-prefix=FISSION %s
|
2014-08-27 13:04:14 +08:00
|
|
|
; RUN: llvm-readobj -s -t %t | FileCheck --check-prefix=OBJ_FISSION %s
|
2013-11-26 08:22:37 +08:00
|
|
|
|
2014-02-12 08:40:47 +08:00
|
|
|
; Generated from bar.cpp:
|
|
|
|
|
|
|
|
; #line 1 "bar.h"
|
2013-07-27 01:02:41 +08:00
|
|
|
; struct bar {};
|
2014-02-12 08:40:47 +08:00
|
|
|
; #line 2 "bar.cpp"
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
; struct bar b;
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
; void foo(void) {
|
|
|
|
; struct baz {};
|
|
|
|
; baz b;
|
|
|
|
; }
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
; namespace echidna {
|
|
|
|
; namespace capybara {
|
|
|
|
; namespace mongoose {
|
|
|
|
; class fluffy {
|
|
|
|
; int a;
|
|
|
|
; int b;
|
|
|
|
; };
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
; fluffy animal;
|
|
|
|
; }
|
|
|
|
; }
|
|
|
|
; }
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
; namespace {
|
2013-07-30 07:53:08 +08:00
|
|
|
; struct walrus {
|
|
|
|
; walrus() {}
|
|
|
|
; };
|
2013-07-27 01:02:41 +08:00
|
|
|
; }
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
; walrus w;
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-30 07:53:05 +08:00
|
|
|
; struct wombat {
|
|
|
|
; struct {
|
2013-07-30 07:53:08 +08:00
|
|
|
; int a;
|
|
|
|
; int b;
|
2013-07-30 07:53:05 +08:00
|
|
|
; } a_b;
|
|
|
|
; };
|
2013-07-30 07:53:08 +08:00
|
|
|
|
2013-07-30 07:53:05 +08:00
|
|
|
; wombat wom;
|
2013-07-27 01:02:41 +08:00
|
|
|
|
2014-01-10 09:38:41 +08:00
|
|
|
; SINGLE-LABEL: .debug_info contents:
|
|
|
|
; FISSION-LABEL: .debug_info.dwo contents:
|
2013-12-05 09:00:12 +08:00
|
|
|
; CHECK: Compile Unit: length = [[CU_SIZE:[0-9a-f]+]]
|
2013-12-14 05:33:40 +08:00
|
|
|
|
2014-03-06 09:42:00 +08:00
|
|
|
; CHECK: [[BAR:^0x........]]: DW_TAG_structure_type
|
2014-02-01 03:52:26 +08:00
|
|
|
; CHECK-NEXT: DW_AT_declaration
|
2014-03-06 09:42:00 +08:00
|
|
|
; CHECK-NEXT: DW_AT_signature {{.*}} (0x1d02f3be30cc5688)
|
|
|
|
; CHECK: [[FLUFFY:^0x........]]: DW_TAG_class_type
|
2014-02-01 03:52:26 +08:00
|
|
|
; CHECK-NEXT: DW_AT_declaration
|
2014-03-06 09:42:00 +08:00
|
|
|
; CHECK-NEXT: DW_AT_signature {{.*}} (0xb04af47397402e77)
|
2014-01-04 02:59:42 +08:00
|
|
|
|
|
|
|
; Ensure the CU-local type 'walrus' is not placed in a type unit.
|
2014-03-06 09:42:00 +08:00
|
|
|
; CHECK: [[WALRUS:^0x........]]: DW_TAG_structure_type
|
2014-01-10 09:38:41 +08:00
|
|
|
; CHECK-NEXT: DW_AT_name{{.*}}"walrus"
|
2014-01-04 02:59:42 +08:00
|
|
|
; CHECK-NEXT: DW_AT_byte_size
|
|
|
|
; CHECK-NEXT: DW_AT_decl_file
|
|
|
|
; CHECK-NEXT: DW_AT_decl_line
|
|
|
|
|
2014-03-06 09:42:00 +08:00
|
|
|
|
|
|
|
; CHECK: [[WOMBAT:^0x........]]: DW_TAG_structure_type
|
|
|
|
; CHECK-NEXT: DW_AT_declaration
|
|
|
|
; CHECK-NEXT: DW_AT_signature {{.*}} (0xfd756cee88f8a118)
|
|
|
|
|
2014-01-10 09:38:41 +08:00
|
|
|
; SINGLE-LABEL: .debug_types contents:
|
2014-08-27 13:04:14 +08:00
|
|
|
; FISSION-NOT: .debug_types contents:
|
2014-01-10 09:38:41 +08:00
|
|
|
; FISSION-LABEL: .debug_types.dwo contents:
|
2013-12-14 05:33:40 +08:00
|
|
|
|
2013-12-13 09:24:54 +08:00
|
|
|
; Check that we generate a hash for bar and the value.
|
2014-01-04 02:59:42 +08:00
|
|
|
; CHECK-NOT: type_signature
|
|
|
|
; CHECK-LABEL: type_signature = 0x1d02f3be30cc5688
|
2013-12-13 09:24:54 +08:00
|
|
|
; CHECK: DW_TAG_structure_type
|
Provide gmlt-like inline scope information in the skeleton CU to facilitate symbolication without needing the .dwo files
Clang -gsplit-dwarf self-host -O0, binary increases by 0.0005%, -O2,
binary increases by 25%.
A large binary inside Google, split-dwarf, -O0, and other internal flags
(GDB index, etc) increases by 1.8%, optimized build is 35%.
The size impact may be somewhat greater in .o files (I haven't measured
that much - since the linked executable -O0 numbers seemed low enough)
due to relocations. These relocations could be removed if we taught the
llvm-symbolizer to handle indexed addressing in the .o file (GDB can't
cope with this just yet, but GDB won't be reading this info anyway).
Also debug_ranges could be shared between .o and .dwo, though ideally
debug_ranges would get a schema that could used index(+offset)
addressing, and move to the .dwo file, then we'd be back to sharing
addresses in the address pool again.
But for now, these sizes seem small enough to go ahead with this.
Verified that no other DW_TAGs are produced into the .o file other than
subprograms and inlined_subroutines.
llvm-svn: 221306
2014-11-05 06:12:25 +08:00
|
|
|
; FISSION-NEXT: DW_AT_name {{.*}} ( indexed {{.*}} "bar"
|
|
|
|
; SINGLE-NEXT: DW_AT_name {{.*}} "bar"
|
2013-11-20 07:08:21 +08:00
|
|
|
|
2013-12-14 05:33:40 +08:00
|
|
|
|
2013-11-20 07:08:21 +08:00
|
|
|
; Check that we generate a hash for fluffy and the value.
|
2014-01-04 02:59:42 +08:00
|
|
|
; CHECK-NOT: type_signature
|
|
|
|
; CHECK-LABEL: type_signature = 0xb04af47397402e77
|
|
|
|
; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x9a0124d5a0c21c52)
|
2013-07-27 01:02:41 +08:00
|
|
|
; CHECK: DW_TAG_namespace
|
2014-01-10 09:38:41 +08:00
|
|
|
; CHECK-NEXT: DW_AT_name{{.*}}"echidna"
|
2013-07-27 01:02:41 +08:00
|
|
|
; CHECK: DW_TAG_namespace
|
2014-01-10 09:38:41 +08:00
|
|
|
; CHECK-NEXT: DW_AT_name{{.*}}"capybara"
|
2013-07-27 01:02:41 +08:00
|
|
|
; CHECK: DW_TAG_namespace
|
2014-01-10 09:38:41 +08:00
|
|
|
; CHECK-NEXT: DW_AT_name{{.*}}"mongoose"
|
2013-07-27 01:02:41 +08:00
|
|
|
; CHECK: DW_TAG_class_type
|
2014-01-10 09:38:41 +08:00
|
|
|
; CHECK-NEXT: DW_AT_name{{.*}}"fluffy"
|
2013-07-30 07:53:05 +08:00
|
|
|
|
2013-12-13 09:24:54 +08:00
|
|
|
; Check that we generate a hash for wombat and the value, but not for the
|
|
|
|
; anonymous type contained within.
|
2014-01-04 02:59:42 +08:00
|
|
|
; CHECK-NOT: type_signature
|
|
|
|
; CHECK-LABEL: type_signature = 0xfd756cee88f8a118
|
|
|
|
; CHECK-NOT: DW_AT_GNU_odr_signature [DW_FORM_data8] (0x685bcc220141e9d7)
|
2013-12-13 09:24:54 +08:00
|
|
|
; CHECK: DW_TAG_structure_type
|
2014-01-10 09:38:41 +08:00
|
|
|
; CHECK-NEXT: DW_AT_name{{.*}}"wombat"
|
2013-12-14 05:33:40 +08:00
|
|
|
|
2014-01-04 02:59:42 +08:00
|
|
|
; CHECK-NOT: type_signature
|
|
|
|
; CHECK-LABEL: type_signature = 0xe94f6d3843e62d6b
|
2013-12-13 09:24:54 +08:00
|
|
|
; CHECK: DW_TAG_type_unit
|
2014-03-18 09:17:26 +08:00
|
|
|
; CHECK: DW_AT_stmt_list [DW_FORM_sec_offset] (0x00000000)
|
2013-12-14 05:33:40 +08:00
|
|
|
; CHECK-NOT: NULL
|
|
|
|
; CHECK-NOT: DW_AT_GNU_odr_signature
|
2013-12-13 09:24:54 +08:00
|
|
|
; CHECK: DW_TAG_structure_type
|
2013-12-14 05:33:40 +08:00
|
|
|
; The signature for the outer 'wombat' type
|
2014-01-04 02:59:42 +08:00
|
|
|
; CHECK: DW_AT_signature [DW_FORM_ref_sig8] (0xfd756cee88f8a118)
|
2013-07-30 07:53:05 +08:00
|
|
|
; CHECK: DW_TAG_structure_type
|
2013-11-20 07:08:21 +08:00
|
|
|
; CHECK-NOT: DW_AT_name
|
|
|
|
; CHECK-NOT: DW_AT_GNU_odr_signature
|
2013-07-30 07:53:05 +08:00
|
|
|
; CHECK: DW_TAG_member
|
2014-01-10 09:38:41 +08:00
|
|
|
; CHECK-NEXT: DW_AT_name{{.*}}"a"
|
2013-07-30 07:53:05 +08:00
|
|
|
|
2014-02-15 03:51:35 +08:00
|
|
|
; CHECK-LABEL: .debug_line contents:
|
|
|
|
; CHECK: Line table prologue
|
|
|
|
; CHECK-NOT: file_names[
|
2014-03-18 09:17:26 +08:00
|
|
|
; SINGLE: file_names{{.*}} bar.h
|
2014-02-15 03:51:35 +08:00
|
|
|
; CHECK: file_names{{.*}} bar.cpp
|
|
|
|
; CHECK-NOT: file_names[
|
2014-03-18 09:17:26 +08:00
|
|
|
|
|
|
|
; CHECK-LABEL: .debug_line.dwo contents:
|
|
|
|
; FISSION: Line table prologue
|
2014-03-18 10:13:23 +08:00
|
|
|
; FISSION: opcode_base: 1
|
|
|
|
; FISSION-NOT: standard_opcode_lengths
|
2014-03-19 08:11:28 +08:00
|
|
|
; FISSION-NOT: include_directories
|
2014-03-18 09:17:26 +08:00
|
|
|
; FISSION-NOT: file_names[
|
|
|
|
; FISSION: file_names{{.*}} bar.h
|
|
|
|
; FISSION: file_names{{.*}} bar.cpp
|
|
|
|
; FISSION-NOT: file_names[
|
|
|
|
|
2014-02-15 03:51:35 +08:00
|
|
|
; CHECK-LABEL: .debug_str contents:
|
|
|
|
|
2013-11-27 03:14:34 +08:00
|
|
|
; Use the unit size as a rough hash/identifier for the unit we're dealing with
|
|
|
|
; it happens to be unambiguous at the moment, but it's hardly ideal.
|
2013-11-26 08:22:37 +08:00
|
|
|
; CHECK-LABEL: .debug_pubtypes contents:
|
2013-11-27 03:14:34 +08:00
|
|
|
; Don't emit pubtype entries for type DIEs in the compile unit that just indirect to a type unit.
|
2013-12-05 09:00:12 +08:00
|
|
|
; CHECK-NEXT: unit_size = [[CU_SIZE]]
|
2013-11-27 03:14:34 +08:00
|
|
|
; CHECK-NEXT: Offset Name
|
2014-06-07 06:16:56 +08:00
|
|
|
; CHECK-DAG: [[BAR]] "bar"
|
|
|
|
; CHECK-DAG: [[WALRUS]] "(anonymous namespace)::walrus"
|
|
|
|
; CHECK-DAG: [[WOMBAT]] "wombat"
|
|
|
|
; CHECK-DAG: [[FLUFFY]] "echidna::capybara::mongoose::fluffy"
|
2013-11-26 08:22:37 +08:00
|
|
|
|
2014-07-26 01:11:58 +08:00
|
|
|
; Make sure debug_types are in comdat groups. This could be more rigid to check
|
|
|
|
; that they're the right comdat groups (each type in a separate comdat group,
|
|
|
|
; etc)
|
2014-08-27 13:04:14 +08:00
|
|
|
; OBJ_SINGLE: Name: .debug_types (
|
|
|
|
; OBJ_SINGLE-NOT: }
|
|
|
|
; OBJ_SINGLE: SHF_GROUP
|
2014-07-26 01:11:58 +08:00
|
|
|
|
|
|
|
; Fission type units don't go in comdat groups, since their linker is debug
|
|
|
|
; aware it's handled using the debug info semantics rather than raw ELF object
|
|
|
|
; semantics.
|
|
|
|
; OBJ_FISSION: Name: .debug_types.dwo (
|
|
|
|
; OBJ_FISSION-NOT: SHF_GROUP
|
|
|
|
; OBJ_FISSION: }
|
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
%struct.bar = type { i8 }
|
|
|
|
%"class.echidna::capybara::mongoose::fluffy" = type { i32, i32 }
|
2013-07-30 07:53:08 +08:00
|
|
|
%"struct.<anonymous namespace>::walrus" = type { i8 }
|
2013-07-30 07:53:05 +08:00
|
|
|
%struct.wombat = type { %struct.anon }
|
|
|
|
%struct.anon = type { i32, i32 }
|
2013-07-27 01:02:41 +08:00
|
|
|
%struct.baz = type { i8 }
|
|
|
|
|
|
|
|
@b = global %struct.bar zeroinitializer, align 1
|
|
|
|
@_ZN7echidna8capybara8mongoose6animalE = global %"class.echidna::capybara::mongoose::fluffy" zeroinitializer, align 4
|
2013-07-30 07:53:08 +08:00
|
|
|
@w = internal global %"struct.<anonymous namespace>::walrus" zeroinitializer, align 1
|
2013-07-30 07:53:05 +08:00
|
|
|
@wom = global %struct.wombat zeroinitializer, align 4
|
2013-07-30 07:53:08 +08:00
|
|
|
@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }]
|
|
|
|
|
2013-07-27 01:02:41 +08:00
|
|
|
; Function Attrs: nounwind uwtable
|
|
|
|
define void @_Z3foov() #0 {
|
|
|
|
entry:
|
|
|
|
%b = alloca %struct.baz, align 1
|
IR: Make metadata typeless in assembly
Now that `Metadata` is typeless, reflect that in the assembly. These
are the matching assembly changes for the metadata/value split in
r223802.
- Only use the `metadata` type when referencing metadata from a call
intrinsic -- i.e., only when it's used as a `Value`.
- Stop pretending that `ValueAsMetadata` is wrapped in an `MDNode`
when referencing it from call intrinsics.
So, assembly like this:
define @foo(i32 %v) {
call void @llvm.foo(metadata !{i32 %v}, metadata !0)
call void @llvm.foo(metadata !{i32 7}, metadata !0)
call void @llvm.foo(metadata !1, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{metadata !3}, metadata !0)
ret void, !bar !2
}
!0 = metadata !{metadata !2}
!1 = metadata !{i32* @global}
!2 = metadata !{metadata !3}
!3 = metadata !{}
turns into this:
define @foo(i32 %v) {
call void @llvm.foo(metadata i32 %v, metadata !0)
call void @llvm.foo(metadata i32 7, metadata !0)
call void @llvm.foo(metadata i32* @global, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{!3}, metadata !0)
ret void, !bar !2
}
!0 = !{!2}
!1 = !{i32* @global}
!2 = !{!3}
!3 = !{}
I wrote an upgrade script that handled almost all of the tests in llvm
and many of the tests in cfe (even handling many `CHECK` lines). I've
attached it (or will attach it in a moment if you're speedy) to PR21532
to help everyone update their out-of-tree testcases.
This is part of PR21532.
llvm-svn: 224257
2014-12-16 03:07:53 +08:00
|
|
|
call void @llvm.dbg.declare(metadata %struct.baz* %b, metadata !46, metadata !{!"0x102"}), !dbg !48
|
2014-02-12 08:40:47 +08:00
|
|
|
ret void, !dbg !49
|
2013-07-27 01:02:41 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
; Function Attrs: nounwind readnone
|
Move the complex address expression out of DIVariable and into an extra
argument of the llvm.dbg.declare/llvm.dbg.value intrinsics.
Previously, DIVariable was a variable-length field that has an optional
reference to a Metadata array consisting of a variable number of
complex address expressions. In the case of OpPiece expressions this is
wasting a lot of storage in IR, because when an aggregate type is, e.g.,
SROA'd into all of its n individual members, the IR will contain n copies
of the DIVariable, all alike, only differing in the complex address
reference at the end.
By making the complex address into an extra argument of the
dbg.value/dbg.declare intrinsics, all of the pieces can reference the
same variable and the complex address expressions can be uniqued across
the CU, too.
Down the road, this will allow us to move other flags, such as
"indirection" out of the DIVariable, too.
The new intrinsics look like this:
declare void @llvm.dbg.declare(metadata %storage, metadata %var, metadata %expr)
declare void @llvm.dbg.value(metadata %storage, i64 %offset, metadata %var, metadata %expr)
This patch adds a new LLVM-local tag to DIExpressions, so we can detect
and pretty-print DIExpression metadata nodes.
What this patch doesn't do:
This patch does not touch the "Indirect" field in DIVariable; but moving
that into the expression would be a natural next step.
http://reviews.llvm.org/D4919
rdar://problem/17994491
Thanks to dblaikie and dexonsmith for reviewing this patch!
Note: I accidentally committed a bogus older version of this patch previously.
llvm-svn: 218787
2014-10-02 02:55:02 +08:00
|
|
|
declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
|
2013-07-27 01:02:41 +08:00
|
|
|
|
2013-07-30 07:53:08 +08:00
|
|
|
define internal void @__cxx_global_var_init() section ".text.startup" {
|
|
|
|
entry:
|
2014-02-12 08:40:47 +08:00
|
|
|
call void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* @w), !dbg !50
|
|
|
|
ret void, !dbg !50
|
2013-07-30 07:53:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
; Function Attrs: nounwind uwtable
|
|
|
|
define internal void @_ZN12_GLOBAL__N_16walrusC2Ev(%"struct.<anonymous namespace>::walrus"* %this) unnamed_addr #0 align 2 {
|
|
|
|
entry:
|
|
|
|
%this.addr = alloca %"struct.<anonymous namespace>::walrus"*, align 8
|
|
|
|
store %"struct.<anonymous namespace>::walrus"* %this, %"struct.<anonymous namespace>::walrus"** %this.addr, align 8
|
IR: Make metadata typeless in assembly
Now that `Metadata` is typeless, reflect that in the assembly. These
are the matching assembly changes for the metadata/value split in
r223802.
- Only use the `metadata` type when referencing metadata from a call
intrinsic -- i.e., only when it's used as a `Value`.
- Stop pretending that `ValueAsMetadata` is wrapped in an `MDNode`
when referencing it from call intrinsics.
So, assembly like this:
define @foo(i32 %v) {
call void @llvm.foo(metadata !{i32 %v}, metadata !0)
call void @llvm.foo(metadata !{i32 7}, metadata !0)
call void @llvm.foo(metadata !1, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{metadata !3}, metadata !0)
ret void, !bar !2
}
!0 = metadata !{metadata !2}
!1 = metadata !{i32* @global}
!2 = metadata !{metadata !3}
!3 = metadata !{}
turns into this:
define @foo(i32 %v) {
call void @llvm.foo(metadata i32 %v, metadata !0)
call void @llvm.foo(metadata i32 7, metadata !0)
call void @llvm.foo(metadata i32* @global, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{!3}, metadata !0)
ret void, !bar !2
}
!0 = !{!2}
!1 = !{i32* @global}
!2 = !{!3}
!3 = !{}
I wrote an upgrade script that handled almost all of the tests in llvm
and many of the tests in cfe (even handling many `CHECK` lines). I've
attached it (or will attach it in a moment if you're speedy) to PR21532
to help everyone update their out-of-tree testcases.
This is part of PR21532.
llvm-svn: 224257
2014-12-16 03:07:53 +08:00
|
|
|
call void @llvm.dbg.declare(metadata %"struct.<anonymous namespace>::walrus"** %this.addr, metadata !51, metadata !{!"0x102"}), !dbg !53
|
2013-07-30 07:53:08 +08:00
|
|
|
%this1 = load %"struct.<anonymous namespace>::walrus"** %this.addr
|
2014-02-12 08:40:47 +08:00
|
|
|
ret void, !dbg !54
|
2013-07-30 07:53:08 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
define internal void @_GLOBAL__I_a() section ".text.startup" {
|
|
|
|
entry:
|
2014-02-12 08:40:47 +08:00
|
|
|
call void @__cxx_global_var_init(), !dbg !55
|
|
|
|
ret void, !dbg !55
|
2013-07-30 07:53:08 +08:00
|
|
|
}
|
|
|
|
|
2013-11-02 06:29:28 +08:00
|
|
|
attributes #0 = { nounwind uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
2013-07-27 01:02:41 +08:00
|
|
|
attributes #1 = { nounwind readnone }
|
|
|
|
|
|
|
|
!llvm.dbg.cu = !{!0}
|
2014-02-12 08:40:47 +08:00
|
|
|
!llvm.module.flags = !{!43, !44}
|
|
|
|
!llvm.ident = !{!45}
|
2013-07-27 01:02:41 +08:00
|
|
|
|
IR: Make metadata typeless in assembly
Now that `Metadata` is typeless, reflect that in the assembly. These
are the matching assembly changes for the metadata/value split in
r223802.
- Only use the `metadata` type when referencing metadata from a call
intrinsic -- i.e., only when it's used as a `Value`.
- Stop pretending that `ValueAsMetadata` is wrapped in an `MDNode`
when referencing it from call intrinsics.
So, assembly like this:
define @foo(i32 %v) {
call void @llvm.foo(metadata !{i32 %v}, metadata !0)
call void @llvm.foo(metadata !{i32 7}, metadata !0)
call void @llvm.foo(metadata !1, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{metadata !3}, metadata !0)
ret void, !bar !2
}
!0 = metadata !{metadata !2}
!1 = metadata !{i32* @global}
!2 = metadata !{metadata !3}
!3 = metadata !{}
turns into this:
define @foo(i32 %v) {
call void @llvm.foo(metadata i32 %v, metadata !0)
call void @llvm.foo(metadata i32 7, metadata !0)
call void @llvm.foo(metadata i32* @global, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{!3}, metadata !0)
ret void, !bar !2
}
!0 = !{!2}
!1 = !{i32* @global}
!2 = !{!3}
!3 = !{}
I wrote an upgrade script that handled almost all of the tests in llvm
and many of the tests in cfe (even handling many `CHECK` lines). I've
attached it (or will attach it in a moment if you're speedy) to PR21532
to help everyone update their out-of-tree testcases.
This is part of PR21532.
llvm-svn: 224257
2014-12-16 03:07:53 +08:00
|
|
|
!0 = !{!"0x11\004\00clang version 3.5 \000\00\000\00bar.dwo\000", !1, !2, !3, !21, !38, !2} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/bar.cpp] [DW_LANG_C_plus_plus]
|
|
|
|
!1 = !{!"bar.cpp", !"/tmp/dbginfo"}
|
|
|
|
!2 = !{}
|
|
|
|
!3 = !{!4, !6, !14, !17}
|
|
|
|
!4 = !{!"0x13\00bar\001\008\008\000\000\000", !5, null, null, !2, null, null, !"_ZTS3bar"} ; [ DW_TAG_structure_type ] [bar] [line 1, size 8, align 8, offset 0] [def] [from ]
|
|
|
|
!5 = !{!"bar.h", !"/tmp/dbginfo"}
|
|
|
|
!6 = !{!"0x2\00fluffy\0013\0064\0032\000\000\000", !1, !7, null, !10, null, null, !"_ZTSN7echidna8capybara8mongoose6fluffyE"} ; [ DW_TAG_class_type ] [fluffy] [line 13, size 64, align 32, offset 0] [def] [from ]
|
|
|
|
!7 = !{!"0x39\00mongoose\0012", !1, !8} ; [ DW_TAG_namespace ] [mongoose] [line 12]
|
|
|
|
!8 = !{!"0x39\00capybara\0011", !1, !9} ; [ DW_TAG_namespace ] [capybara] [line 11]
|
|
|
|
!9 = !{!"0x39\00echidna\0010", !1, null} ; [ DW_TAG_namespace ] [echidna] [line 10]
|
|
|
|
!10 = !{!11, !13}
|
|
|
|
!11 = !{!"0xd\00a\0014\0032\0032\000\001", !1, !"_ZTSN7echidna8capybara8mongoose6fluffyE", !12} ; [ DW_TAG_member ] [a] [line 14, size 32, align 32, offset 0] [private] [from int]
|
|
|
|
!12 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
|
|
|
|
!13 = !{!"0xd\00b\0015\0032\0032\0032\001", !1, !"_ZTSN7echidna8capybara8mongoose6fluffyE", !12} ; [ DW_TAG_member ] [b] [line 15, size 32, align 32, offset 32] [private] [from int]
|
|
|
|
!14 = !{!"0x13\00wombat\0031\0064\0032\000\000\000", !1, null, null, !15, null, null, !"_ZTS6wombat"} ; [ DW_TAG_structure_type ] [wombat] [line 31, size 64, align 32, offset 0] [def] [from ]
|
|
|
|
!15 = !{!16}
|
|
|
|
!16 = !{!"0xd\00a_b\0035\0064\0032\000\000", !1, !"_ZTS6wombat", !"_ZTSN6wombatUt_E"} ; [ DW_TAG_member ] [a_b] [line 35, size 64, align 32, offset 0] [from _ZTSN6wombatUt_E]
|
|
|
|
!17 = !{!"0x13\00\0032\0064\0032\000\000\000", !1, !"_ZTS6wombat", null, !18, null, null, !"_ZTSN6wombatUt_E"} ; [ DW_TAG_structure_type ] [line 32, size 64, align 32, offset 0] [def] [from ]
|
|
|
|
!18 = !{!19, !20}
|
|
|
|
!19 = !{!"0xd\00a\0033\0032\0032\000\000", !1, !"_ZTSN6wombatUt_E", !12} ; [ DW_TAG_member ] [a] [line 33, size 32, align 32, offset 0] [from int]
|
|
|
|
!20 = !{!"0xd\00b\0034\0032\0032\0032\000", !1, !"_ZTSN6wombatUt_E", !12} ; [ DW_TAG_member ] [b] [line 34, size 32, align 32, offset 32] [from int]
|
|
|
|
!21 = !{!22, !26, !27, !36}
|
|
|
|
!22 = !{!"0x2e\00foo\00foo\00_Z3foov\005\000\001\000\006\00256\000\005", !1, !23, !24, null, void ()* @_Z3foov, null, null, !2} ; [ DW_TAG_subprogram ] [line 5] [def] [foo]
|
|
|
|
!23 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [/tmp/dbginfo/bar.cpp]
|
|
|
|
!24 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !25, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
|
|
|
|
!25 = !{null}
|
|
|
|
!26 = !{!"0x2e\00__cxx_global_var_init\00__cxx_global_var_init\00\0029\001\001\000\006\00256\000\0029", !1, !23, !24, null, void ()* @__cxx_global_var_init, null, null, !2} ; [ DW_TAG_subprogram ] [line 29] [local] [def] [__cxx_global_var_init]
|
|
|
|
!27 = !{!"0x2e\00walrus\00walrus\00_ZN12_GLOBAL__N_16walrusC2Ev\0025\001\001\000\006\00256\000\0025", !1, !28, !32, null, void (%"struct.<anonymous namespace>::walrus"*)* @_ZN12_GLOBAL__N_16walrusC2Ev, null, !31, !2} ; [ DW_TAG_subprogram ] [line 25] [local] [def] [walrus]
|
|
|
|
!28 = !{!"0x13\00walrus\0024\008\008\000\000\000", !1, !29, null, !30, null, null, null} ; [ DW_TAG_structure_type ] [walrus] [line 24, size 8, align 8, offset 0] [def] [from ]
|
|
|
|
!29 = !{!"0x39\00\0023", !1, null} ; [ DW_TAG_namespace ] [line 23]
|
|
|
|
!30 = !{!31}
|
|
|
|
!31 = !{!"0x2e\00walrus\00walrus\00\0025\000\000\000\006\00256\000\0025", !1, !28, !32, null, null, null, i32 0, !35} ; [ DW_TAG_subprogram ] [line 25] [walrus]
|
|
|
|
!32 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !33, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
|
|
|
|
!33 = !{null, !34}
|
|
|
|
!34 = !{!"0xf\00\000\0064\0064\000\001088", null, null, !28} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [artificial] [from walrus]
|
|
|
|
!35 = !{i32 786468}
|
|
|
|
!36 = !{!"0x2e\00\00\00_GLOBAL__I_a\0025\001\001\000\006\0064\000\0025", !1, !23, !37, null, void ()* @_GLOBAL__I_a, null, null, !2} ; [ DW_TAG_subprogram ] [line 25] [local] [def]
|
|
|
|
!37 = !{!"0x15\00\000\000\000\000\000\000", i32 0, null, null, !2, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]
|
|
|
|
!38 = !{!39, !40, !41, !42}
|
|
|
|
!39 = !{!"0x34\00b\00b\00\003\000\001", null, !23, !4, %struct.bar* @b, null} ; [ DW_TAG_variable ] [b] [line 3] [def]
|
|
|
|
!40 = !{!"0x34\00animal\00animal\00_ZN7echidna8capybara8mongoose6animalE\0018\000\001", !7, !23, !6, %"class.echidna::capybara::mongoose::fluffy"* @_ZN7echidna8capybara8mongoose6animalE, null} ; [ DW_TAG_variable ] [animal] [line 18] [def]
|
|
|
|
!41 = !{!"0x34\00w\00w\00\0029\001\001", null, !23, !28, %"struct.<anonymous namespace>::walrus"* @w, null} ; [ DW_TAG_variable ] [w] [line 29] [local] [def]
|
|
|
|
!42 = !{!"0x34\00wom\00wom\00\0038\000\001", null, !23, !14, %struct.wombat* @wom, null} ; [ DW_TAG_variable ] [wom] [line 38] [def]
|
|
|
|
!43 = !{i32 2, !"Dwarf Version", i32 4}
|
|
|
|
!44 = !{i32 1, !"Debug Info Version", i32 2}
|
|
|
|
!45 = !{!"clang version 3.5 "}
|
|
|
|
!46 = !{!"0x100\00b\007\000", !22, !23, !47} ; [ DW_TAG_auto_variable ] [b] [line 7]
|
|
|
|
!47 = !{!"0x13\00baz\006\008\008\000\000\000", !1, !22, null, !2, null, null, null} ; [ DW_TAG_structure_type ] [baz] [line 6, size 8, align 8, offset 0] [def] [from ]
|
2015-01-15 06:27:36 +08:00
|
|
|
!48 = !MDLocation(line: 7, scope: !22)
|
|
|
|
!49 = !MDLocation(line: 8, scope: !22)
|
|
|
|
!50 = !MDLocation(line: 29, scope: !26)
|
IR: Make metadata typeless in assembly
Now that `Metadata` is typeless, reflect that in the assembly. These
are the matching assembly changes for the metadata/value split in
r223802.
- Only use the `metadata` type when referencing metadata from a call
intrinsic -- i.e., only when it's used as a `Value`.
- Stop pretending that `ValueAsMetadata` is wrapped in an `MDNode`
when referencing it from call intrinsics.
So, assembly like this:
define @foo(i32 %v) {
call void @llvm.foo(metadata !{i32 %v}, metadata !0)
call void @llvm.foo(metadata !{i32 7}, metadata !0)
call void @llvm.foo(metadata !1, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{metadata !3}, metadata !0)
ret void, !bar !2
}
!0 = metadata !{metadata !2}
!1 = metadata !{i32* @global}
!2 = metadata !{metadata !3}
!3 = metadata !{}
turns into this:
define @foo(i32 %v) {
call void @llvm.foo(metadata i32 %v, metadata !0)
call void @llvm.foo(metadata i32 7, metadata !0)
call void @llvm.foo(metadata i32* @global, metadata !0)
call void @llvm.foo(metadata !3, metadata !0)
call void @llvm.foo(metadata !{!3}, metadata !0)
ret void, !bar !2
}
!0 = !{!2}
!1 = !{i32* @global}
!2 = !{!3}
!3 = !{}
I wrote an upgrade script that handled almost all of the tests in llvm
and many of the tests in cfe (even handling many `CHECK` lines). I've
attached it (or will attach it in a moment if you're speedy) to PR21532
to help everyone update their out-of-tree testcases.
This is part of PR21532.
llvm-svn: 224257
2014-12-16 03:07:53 +08:00
|
|
|
!51 = !{!"0x101\00this\0016777216\001088", !27, null, !52} ; [ DW_TAG_arg_variable ] [this] [line 0]
|
|
|
|
!52 = !{!"0xf\00\000\0064\0064\000\000", null, null, !28} ; [ DW_TAG_pointer_type ] [line 0, size 64, align 64, offset 0] [from walrus]
|
2015-01-15 06:27:36 +08:00
|
|
|
!53 = !MDLocation(line: 0, scope: !27)
|
|
|
|
!54 = !MDLocation(line: 25, scope: !27)
|
|
|
|
!55 = !MDLocation(line: 25, scope: !36)
|