1
0
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:
Bjorn Pettersson 2018-01-05 22:20:30 +00:00
parent 5e632d7ff2
commit 7bfe1ca83a
4 changed files with 31 additions and 12 deletions

View File

@ -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

View File

@ -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("");
}
}
};

View File

@ -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

View File

@ -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