mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 02:52:53 +02:00
[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
This commit is contained in:
parent
5e632d7ff2
commit
7bfe1ca83a
@ -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
|
||||
|
@ -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("");
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user