forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DebugInfo] Handle endianness when moving debug info for split intege…
…r values (reapplied) Summary: Take the target's endianness into account when splitting the debug information in DAGTypeLegalizer::SetExpandedInteger. This patch fixes so that, for big-endian targets, the fragment expression corresponding to the high part of a split integer value is placed at offset 0, in order to correctly represent the memory address order. I have attached a PPC32 reproducer where the resulting DWARF pieces for a 64-bit integer were incorrectly reversed. Original patch was reverted due to using -stop-after=isel in the test case (but that is only working when AMDGPU target is included in the llc build). The test case has now been updated to use -stop-before=expand-isel-pseudos instead. Patch by: dstenb Reviewers: JDevlieghere, aprantl, dblaikie Reviewed By: JDevlieghere, aprantl, dblaikie Subscribers: nemanjai Differential Revision: https://reviews.llvm.org/D38172 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314781 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
2 changed files
with
73 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
; RUN: llc < %s -stop-before=expand-isel-pseudos -o - | FileCheck %s | ||
|
||
source_filename = "foo.c" | ||
target datalayout = "E-m:e-p:32:32-i64:64-n32" | ||
target triple = "ppc32" | ||
|
||
; Verify that, when handling split-up integers, the | ||
; transferring of debug info takes the endianness | ||
; into consideration. | ||
; | ||
; The fragment expression at offset 0 should correspond | ||
; to the high part of the value on big-endian targets. | ||
|
||
; This basis of this ll file was created by running: | ||
; clang --target=powerpc -O1 -S -g -emit-llvm foo.c | ||
; | ||
; with foo.c being the program: | ||
; unsigned long long foo(void); | ||
; void bar() { | ||
; volatile unsigned long long result = foo(); | ||
; } | ||
; | ||
; This file is a slight tweak of that output, with irrelevant | ||
; lifetime intrinsics, metadata, and debug info being removed. | ||
|
||
; CHECK: [[DL:![0-9]+]] = !DILocalVariable(name: "result" | ||
; | ||
; High 32 bits in R3, low 32 bits in R4 | ||
; CHECK: %0 = COPY %r3 | ||
; CHECK: DBG_VALUE debug-use %0, debug-use _, [[DL]], !DIExpression(DW_OP_LLVM_fragment, 0, 32) | ||
; CHECK: %1 = COPY %r4 | ||
; CHECK: DBG_VALUE debug-use %1, debug-use _, [[DL]], !DIExpression(DW_OP_LLVM_fragment, 32, 32) | ||
define void @bar() local_unnamed_addr #0 !dbg !6 { | ||
%1 = alloca i64, align 8 | ||
%2 = tail call i64 @foo() | ||
tail call void @llvm.dbg.value(metadata i64 %2, metadata !10, metadata !DIExpression()), !dbg !13 | ||
store volatile i64 %2, i64* %1, align 8 | ||
ret void | ||
} | ||
|
||
declare i64 @foo() local_unnamed_addr | ||
|
||
; Function Attrs: nounwind readnone speculatable | ||
declare void @llvm.dbg.value(metadata, metadata, metadata) #1 | ||
|
||
attributes #0 = { nounwind } | ||
attributes #1 = { nounwind readnone speculatable } | ||
|
||
!llvm.dbg.cu = !{!0} | ||
!llvm.module.flags = !{!3, !4} | ||
!llvm.ident = !{!5} | ||
|
||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 6.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) | ||
!1 = !DIFile(filename: "foo.c", directory: "/") | ||
!2 = !{} | ||
!3 = !{i32 2, !"Dwarf Version", i32 4} | ||
!4 = !{i32 2, !"Debug Info Version", i32 3} | ||
!5 = !{!"clang version 6.0.0"} | ||
!6 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 2, type: !7, isLocal: false, isDefinition: true, scopeLine: 2, isOptimized: true, unit: !0, variables: !9) | ||
!7 = !DISubroutineType(types: !8) | ||
!8 = !{null} | ||
!9 = !{!10} | ||
!10 = !DILocalVariable(name: "result", scope: !6, file: !1, line: 3, type: !11) | ||
!11 = !DIDerivedType(tag: DW_TAG_volatile_type, baseType: !12) | ||
!12 = !DIBasicType(name: "long long unsigned int", size: 64, encoding: DW_ATE_unsigned) | ||
!13 = !DILocation(line: 3, column: 31, scope: !6) |