mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-18 13:34:04 +00:00
b056aa798d
Move the specialized metadata nodes for the new debug info hierarchy into place, finishing off PR22464. I've done bootstraps (and all that) and I'm confident this commit is NFC as far as DWARF output is concerned. Let me know if I'm wrong :). The code changes are fairly mechanical: - Bumped the "Debug Info Version". - `DIBuilder` now creates the appropriate subclass of `MDNode`. - Subclasses of DIDescriptor now expect to hold their "MD" counterparts (e.g., `DIBasicType` expects `MDBasicType`). - Deleted a ton of dead code in `AsmWriter.cpp` and `DebugInfo.cpp` for printing comments. - Big update to LangRef to describe the nodes in the new hierarchy. Feel free to make it better. Testcase changes are enormous. There's an accompanying clang commit on its way. If you have out-of-tree debug info testcases, I just broke your build. - `upgrade-specialized-nodes.sh` is attached to PR22564. I used it to update all the IR testcases. - Unfortunately I failed to find way to script the updates to CHECK lines, so I updated all of these by hand. This was fairly painful, since the old CHECKs are difficult to reason about. That's one of the benefits of the new hierarchy. This work isn't quite finished, BTW. The `DIDescriptor` subclasses are almost empty wrappers, but not quite: they still have loose casting checks (see the `RETURN_FROM_RAW()` macro). Once they're completely gutted, I'll rename the "MD" classes to "DI" and kill the wrappers. I also expect to make a few schema changes now that it's easier to reason about everything. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231082 91177308-0d34-0410-b5e6-96231b3b80d8
140 lines
6.1 KiB
LLVM
140 lines
6.1 KiB
LLVM
; REQUIRES: object-emission
|
|
|
|
; RUN: llc -mtriple=i386-linux-gnu -filetype=obj -relocation-model=pic %s -o /dev/null
|
|
|
|
; Derived from the test case in PR20367, there's nothing really positive to
|
|
; test here (hence no FileCheck, etc). All that was wrong is that the debug info
|
|
; intrinsics (introduced by inlining) in 'f1' were causing codegen to crash, but
|
|
; since 'f1' is a nodebug function, there's no positive outcome to confirm, just
|
|
; that debug info doesn't get in the way/cause a crash.
|
|
|
|
; The test case isn't particularly well reduced/tidy, but as simple as I could
|
|
; get the C++ source. I assume the complexity is mostly just about producing a
|
|
; certain amount of register pressure, so it might be able to be simplified/made
|
|
; more uniform.
|
|
|
|
; Generated from:
|
|
; $ clang-tot -cc1 -triple i386 -emit-obj -g -O3 repro.cpp
|
|
; void sink(const void *);
|
|
; int source();
|
|
; void f3(int);
|
|
;
|
|
; extern bool b;
|
|
;
|
|
; struct string {
|
|
; unsigned *mem;
|
|
; };
|
|
;
|
|
; extern string &str;
|
|
;
|
|
; inline __attribute__((always_inline)) void s2(string *lhs) { sink(lhs->mem); }
|
|
; inline __attribute__((always_inline)) void f() {
|
|
; string str2;
|
|
; s2(&str2);
|
|
; sink(&str2);
|
|
; }
|
|
; void __attribute__((nodebug)) f1() {
|
|
; for (int iter = 0; iter != 2; ++iter) {
|
|
; f();
|
|
; sink(str.mem);
|
|
; if (b) return;
|
|
; }
|
|
; }
|
|
|
|
%struct.string = type { i32* }
|
|
|
|
@str = external constant %struct.string*
|
|
@b = external global i8
|
|
|
|
; Function Attrs: nounwind
|
|
define void @_Z2f1v() #0 {
|
|
entry:
|
|
%str2.i = alloca %struct.string, align 4
|
|
%0 = bitcast %struct.string* %str2.i to i8*, !dbg !26
|
|
%1 = load %struct.string*, %struct.string** @str, align 4
|
|
%mem = getelementptr inbounds %struct.string, %struct.string* %1, i32 0, i32 0
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %for.body, %entry
|
|
%iter.02 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
|
|
call void @llvm.lifetime.start(i64 4, i8* %0), !dbg !26
|
|
call void @llvm.dbg.value(metadata %struct.string* %str2.i, i64 0, metadata !16, metadata !MDExpression()) #3, !dbg !26
|
|
call void @llvm.dbg.value(metadata %struct.string* %str2.i, i64 0, metadata !27, metadata !MDExpression()) #3, !dbg !29
|
|
call void @_Z4sinkPKv(i8* undef) #3, !dbg !29
|
|
call void @_Z4sinkPKv(i8* %0) #3, !dbg !30
|
|
call void @llvm.lifetime.end(i64 4, i8* %0), !dbg !31
|
|
%2 = load i32*, i32** %mem, align 4, !tbaa !32
|
|
%3 = bitcast i32* %2 to i8*
|
|
call void @_Z4sinkPKv(i8* %3) #3
|
|
%4 = load i8, i8* @b, align 1, !tbaa !37, !range !39
|
|
%tobool = icmp ne i8 %4, 0
|
|
%inc = add nsw i32 %iter.02, 1
|
|
%cmp = icmp eq i32 %inc, 2
|
|
%or.cond = or i1 %tobool, %cmp
|
|
br i1 %or.cond, label %for.end, label %for.body
|
|
|
|
for.end: ; preds = %for.body
|
|
ret void
|
|
}
|
|
|
|
declare void @_Z4sinkPKv(i8*) #1
|
|
|
|
; Function Attrs: nounwind readnone
|
|
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @llvm.lifetime.start(i64, i8* nocapture) #3
|
|
|
|
; Function Attrs: nounwind
|
|
declare void @llvm.lifetime.end(i64, i8* nocapture) #3
|
|
|
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
|
attributes #2 = { nounwind readnone }
|
|
attributes #3 = { nounwind }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!23, !24}
|
|
!llvm.ident = !{!25}
|
|
|
|
!0 = !MDCompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.5.0 ", isOptimized: true, emissionKind: 1, file: !1, enums: !2, retainedTypes: !3, subprograms: !10, globals: !2, imports: !2)
|
|
!1 = !MDFile(filename: "<stdin>", directory: "/tmp/dbginfo")
|
|
!2 = !{}
|
|
!3 = !{!4}
|
|
!4 = !MDCompositeType(tag: DW_TAG_structure_type, name: "string", line: 7, size: 32, align: 32, file: !5, elements: !6, identifier: "_ZTS6string")
|
|
!5 = !MDFile(filename: "repro.cpp", directory: "/tmp/dbginfo")
|
|
!6 = !{!7}
|
|
!7 = !MDDerivedType(tag: DW_TAG_member, name: "mem", line: 8, size: 32, align: 32, file: !5, scope: !"_ZTS6string", baseType: !8)
|
|
!8 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 32, align: 32, baseType: !9)
|
|
!9 = !MDBasicType(tag: DW_TAG_base_type, name: "unsigned int", size: 32, align: 32, encoding: DW_ATE_unsigned)
|
|
!10 = !{!11, !17}
|
|
!11 = !MDSubprogram(name: "f", linkageName: "_Z1fv", line: 14, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 14, file: !5, scope: !12, type: !13, variables: !15)
|
|
!12 = !MDFile(filename: "repro.cpp", directory: "/tmp/dbginfo")
|
|
!13 = !MDSubroutineType(types: !14)
|
|
!14 = !{null}
|
|
!15 = !{!16}
|
|
!16 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "str2", line: 15, scope: !11, file: !12, type: !"_ZTS6string")
|
|
!17 = !MDSubprogram(name: "s2", linkageName: "_Z2s2P6string", line: 13, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 13, file: !5, scope: !12, type: !18, variables: !21)
|
|
!18 = !MDSubroutineType(types: !19)
|
|
!19 = !{null, !20}
|
|
!20 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 32, align: 32, baseType: !"_ZTS6string")
|
|
!21 = !{!22}
|
|
!22 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "lhs", line: 13, arg: 1, scope: !17, file: !12, type: !20)
|
|
!23 = !{i32 2, !"Dwarf Version", i32 4}
|
|
!24 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!25 = !{!"clang version 3.5.0 "}
|
|
!26 = !MDLocation(line: 15, scope: !11)
|
|
!27 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "lhs", line: 13, arg: 1, scope: !17, file: !12, type: !20, inlinedAt: !28)
|
|
!28 = !MDLocation(line: 16, scope: !11)
|
|
!29 = !MDLocation(line: 13, scope: !17, inlinedAt: !28)
|
|
!30 = !MDLocation(line: 17, scope: !11)
|
|
!31 = !MDLocation(line: 18, scope: !11)
|
|
!32 = !{!33, !34, i64 0}
|
|
!33 = !{!"_ZTS6string", !34, i64 0}
|
|
!34 = !{!"any pointer", !35, i64 0}
|
|
!35 = !{!"omnipotent char", !36, i64 0}
|
|
!36 = !{!"Simple C/C++ TBAA"}
|
|
!37 = !{!38, !38, i64 0}
|
|
!38 = !{!"bool", !35, i64 0}
|
|
!39 = !{i8 0, i8 2}
|