diff options
| author | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2018-01-05 22:20:30 +0000 |
|---|---|---|
| committer | Bjorn Pettersson <bjorn.a.pettersson@ericsson.com> | 2018-01-05 22:20:30 +0000 |
| commit | 5ffb1c0ff02d389b0feebf864332188b83cb9fdf (patch) | |
| tree | 369e7f046c4e65629fc0d851af712d2a7cc547c3 /llvm | |
| parent | c192d1942e4186a6990d22228bf421612242836a (diff) | |
| download | bcm5719-llvm-5ffb1c0ff02d389b0feebf864332188b83cb9fdf.tar.gz bcm5719-llvm-5ffb1c0ff02d389b0feebf864332188b83cb9fdf.zip | |
[DebugInfo] Align comments in debug_loc section
Summary:
This commit updates the BufferByteStreamer, used by DebugLocStream
to buffer bytes/comments to put in the debug_loc section, to
make sure that the Buffer and Comments vectors are synced.
Previously, when an SLEB128 or ULEB128 was emitted together with
a comment, the vectors could be out-of-sync if the LEB encoding
added several entries to the Buffer vectors, while we only added
a single entry to the Comments vector.
The goal with this is to get the comments in the debug_loc
section in the .s file correctly aligned.
Example (using ARM as target):
Instead of
.byte 144 @ sub-register DW_OP_regx
.byte 128 @ 256
.byte 2 @ DW_OP_piece
.byte 147 @ 8
.byte 8 @ sub-register DW_OP_regx
.byte 144 @ 257
.byte 129 @ DW_OP_piece
.byte 2 @ 8
.byte 147 @
.byte 8 @
we now get
.byte 144 @ sub-register DW_OP_regx
.byte 128 @ 256
.byte 2 @
.byte 147 @ DW_OP_piece
.byte 8 @ 8
.byte 144 @ sub-register DW_OP_regx
.byte 129 @ 257
.byte 2 @
.byte 147 @ DW_OP_piece
.byte 8 @ 8
Reviewers: JDevlieghere, rnk, aprantl
Reviewed By: aprantl
Subscribers: davide, Ka-Ka, uabelho, aemerson, javed.absar, kristof.beyls, llvm-commits, JDevlieghere
Differential Revision: https://reviews.llvm.org/D41763
llvm-svn: 321907
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Support/LEB128.h | 17 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/ByteStreamer.h | 20 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/debug-info-qreg.ll | 2 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/X86/dw_op_minus.ll | 4 |
4 files changed, 31 insertions, 12 deletions
diff --git a/llvm/include/llvm/Support/LEB128.h b/llvm/include/llvm/Support/LEB128.h index 6af6e9f3447..9feb0722922 100644 --- a/llvm/include/llvm/Support/LEB128.h +++ b/llvm/include/llvm/Support/LEB128.h @@ -19,9 +19,10 @@ namespace llvm { -/// Utility function to encode a SLEB128 value to an output stream. -inline void encodeSLEB128(int64_t Value, raw_ostream &OS, - unsigned PadTo = 0) { +/// Utility function to encode a SLEB128 value to an output stream. Returns +/// the length in bytes of the encoded value. +inline unsigned encodeSLEB128(int64_t Value, raw_ostream &OS, + unsigned PadTo = 0) { bool More; unsigned Count = 0; do { @@ -42,7 +43,9 @@ inline void encodeSLEB128(int64_t Value, raw_ostream &OS, for (; Count < PadTo - 1; ++Count) OS << char(PadValue | 0x80); OS << char(PadValue); + Count++; } + return Count; } /// Utility function to encode a SLEB128 value to a buffer. Returns @@ -73,9 +76,10 @@ inline unsigned encodeSLEB128(int64_t Value, uint8_t *p, unsigned PadTo = 0) { return (unsigned)(p - orig_p); } -/// Utility function to encode a ULEB128 value to an output stream. -inline void encodeULEB128(uint64_t Value, raw_ostream &OS, - unsigned PadTo = 0) { +/// Utility function to encode a ULEB128 value to an output stream. Returns +/// the length in bytes of the encoded value. +inline unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, + unsigned PadTo = 0) { unsigned Count = 0; do { uint8_t Byte = Value & 0x7f; @@ -93,6 +97,7 @@ inline void encodeULEB128(uint64_t Value, raw_ostream &OS, OS << '\x00'; Count++; } + return Count; } /// Utility function to encode a ULEB128 value to a buffer. Returns diff --git a/llvm/lib/CodeGen/AsmPrinter/ByteStreamer.h b/llvm/lib/CodeGen/AsmPrinter/ByteStreamer.h index aaf6180c940..34ad66f8a39 100644 --- a/llvm/lib/CodeGen/AsmPrinter/ByteStreamer.h +++ b/llvm/lib/CodeGen/AsmPrinter/ByteStreamer.h @@ -93,15 +93,27 @@ public: } void EmitSLEB128(uint64_t DWord, const Twine &Comment) override { raw_svector_ostream OSE(Buffer); - encodeSLEB128(DWord, OSE); - if (GenerateComments) + unsigned Length = encodeSLEB128(DWord, OSE); + if (GenerateComments) { Comments.push_back(Comment.str()); + // Add some empty comments to keep the Buffer and Comments vectors aligned + // with each other. + for (size_t i = 1; i < Length; ++i) + Comments.push_back(""); + + } } void EmitULEB128(uint64_t DWord, const Twine &Comment) override { raw_svector_ostream OSE(Buffer); - encodeULEB128(DWord, OSE); - if (GenerateComments) + unsigned Length = encodeULEB128(DWord, OSE); + if (GenerateComments) { Comments.push_back(Comment.str()); + // Add some empty comments to keep the Buffer and Comments vectors aligned + // with each other. + for (size_t i = 1; i < Length; ++i) + Comments.push_back(""); + + } } }; diff --git a/llvm/test/CodeGen/ARM/debug-info-qreg.ll b/llvm/test/CodeGen/ARM/debug-info-qreg.ll index 658e730bddd..44d30f871b1 100644 --- a/llvm/test/CodeGen/ARM/debug-info-qreg.ll +++ b/llvm/test/CodeGen/ARM/debug-info-qreg.ll @@ -4,10 +4,12 @@ target triple = "thumbv7-apple-macosx10.6.7" ;CHECK: sub-register DW_OP_regx ;CHECK-NEXT: 256 +;CHECK-NEXT: @ ;CHECK-NEXT: DW_OP_piece ;CHECK-NEXT: 8 ;CHECK-NEXT: sub-register DW_OP_regx ;CHECK-NEXT: 257 +;CHECK-NEXT: @ ;CHECK-NEXT: DW_OP_piece ;CHECK-NEXT: 8 diff --git a/llvm/test/DebugInfo/X86/dw_op_minus.ll b/llvm/test/DebugInfo/X86/dw_op_minus.ll index 30bf5837800..ffdf090c884 100644 --- a/llvm/test/DebugInfo/X86/dw_op_minus.ll +++ b/llvm/test/DebugInfo/X86/dw_op_minus.ll @@ -76,5 +76,5 @@ declare void @Capture(i32*) ; CHECK-NEXT: .byte 6 # DW_OP_deref ; CHECK-NEXT: .byte 16 # DW_OP_constu ; CHECK-NEXT: .byte 144 # 400 -; CHECK-NEXT: .byte 3 # DW_OP_minus -; CHECK-NEXT: .byte 28 +; CHECK-NEXT: .byte 3 # +; CHECK-NEXT: .byte 28 # DW_OP_minus |

