mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
Add an option to pad an uleb128 to MCObjectWriter and remove the uleb128 encoding from the DWARF asm printer.
As a side effect we now print dwarf ulebs with .ascii directives. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@143809 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
336b88dac8
commit
c25c908977
@ -188,7 +188,8 @@ public:
|
||||
/// Utility function to encode a SLEB128 value.
|
||||
static void EncodeSLEB128(int64_t Value, raw_ostream &OS);
|
||||
/// Utility function to encode a ULEB128 value.
|
||||
static void EncodeULEB128(uint64_t Value, raw_ostream &OS);
|
||||
static void EncodeULEB128(uint64_t Value, raw_ostream &OS,
|
||||
unsigned Padding = 0);
|
||||
};
|
||||
|
||||
MCObjectWriter *createWinCOFFObjectWriter(raw_ostream &OS, bool is64Bit);
|
||||
|
@ -420,7 +420,8 @@ namespace llvm {
|
||||
|
||||
/// EmitULEB128Value - Special case of EmitULEB128Value that avoids the
|
||||
/// client having to pass in a MCExpr for constant integers.
|
||||
void EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace = 0);
|
||||
void EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace = 0,
|
||||
unsigned Padding = 0);
|
||||
|
||||
/// EmitSLEB128Value - Special case of EmitSLEB128Value that avoids the
|
||||
/// client having to pass in a MCExpr for constant integers.
|
||||
|
@ -36,22 +36,7 @@ void AsmPrinter::EmitSLEB128(int Value, const char *Desc) const {
|
||||
if (isVerbose() && Desc)
|
||||
OutStreamer.AddComment(Desc);
|
||||
|
||||
if (MAI->hasLEB128()) {
|
||||
OutStreamer.EmitSLEB128IntValue(Value);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we don't have .sleb128, emit as .bytes.
|
||||
int Sign = Value >> (8 * sizeof(Value) - 1);
|
||||
bool IsMore;
|
||||
|
||||
do {
|
||||
unsigned char Byte = static_cast<unsigned char>(Value & 0x7f);
|
||||
Value >>= 7;
|
||||
IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0;
|
||||
if (IsMore) Byte |= 0x80;
|
||||
OutStreamer.EmitIntValue(Byte, 1, /*addrspace*/0);
|
||||
} while (IsMore);
|
||||
}
|
||||
|
||||
/// EmitULEB128 - emit the specified signed leb128 value.
|
||||
@ -60,25 +45,7 @@ void AsmPrinter::EmitULEB128(unsigned Value, const char *Desc,
|
||||
if (isVerbose() && Desc)
|
||||
OutStreamer.AddComment(Desc);
|
||||
|
||||
// FIXME: Should we add a PadTo option to the streamer?
|
||||
if (MAI->hasLEB128() && PadTo == 0) {
|
||||
OutStreamer.EmitULEB128IntValue(Value);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we don't have .uleb128 or we want to emit padding, emit as .bytes.
|
||||
do {
|
||||
unsigned char Byte = static_cast<unsigned char>(Value & 0x7f);
|
||||
Value >>= 7;
|
||||
if (Value || PadTo != 0) Byte |= 0x80;
|
||||
OutStreamer.EmitIntValue(Byte, 1, /*addrspace*/0);
|
||||
} while (Value);
|
||||
|
||||
if (PadTo) {
|
||||
if (PadTo > 1)
|
||||
OutStreamer.EmitFill(PadTo - 1, 0x80/*fillval*/, 0/*addrspace*/);
|
||||
OutStreamer.EmitFill(1, 0/*fillval*/, 0/*addrspace*/);
|
||||
}
|
||||
OutStreamer.EmitULEB128IntValue(Value, 0/*addrspace*/, PadTo);
|
||||
}
|
||||
|
||||
/// EmitCFAByte - Emit a .byte 42 directive for a DW_CFA_xxx value.
|
||||
|
@ -33,14 +33,22 @@ void MCObjectWriter::EncodeSLEB128(int64_t Value, raw_ostream &OS) {
|
||||
}
|
||||
|
||||
/// Utility function to encode a ULEB128 value.
|
||||
void MCObjectWriter::EncodeULEB128(uint64_t Value, raw_ostream &OS) {
|
||||
void MCObjectWriter::EncodeULEB128(uint64_t Value, raw_ostream &OS,
|
||||
unsigned Padding) {
|
||||
do {
|
||||
uint8_t Byte = Value & 0x7f;
|
||||
Value >>= 7;
|
||||
if (Value != 0)
|
||||
if (Value != 0 || Padding != 0)
|
||||
Byte |= 0x80; // Mark this byte that that more bytes will follow.
|
||||
OS << char(Byte);
|
||||
} while (Value != 0);
|
||||
|
||||
// Pad with 0x80 and emit a null byte at the end.
|
||||
if (Padding != 0) {
|
||||
for (; Padding != 1; --Padding)
|
||||
OS << '\x80';
|
||||
OS << '\x00';
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -94,10 +94,11 @@ void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,
|
||||
|
||||
/// EmitULEB128Value - Special case of EmitULEB128Value that avoids the
|
||||
/// client having to pass in a MCExpr for constant integers.
|
||||
void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace) {
|
||||
void MCStreamer::EmitULEB128IntValue(uint64_t Value, unsigned AddrSpace,
|
||||
unsigned Padding) {
|
||||
SmallString<32> Tmp;
|
||||
raw_svector_ostream OSE(Tmp);
|
||||
MCObjectWriter::EncodeULEB128(Value, OSE);
|
||||
MCObjectWriter::EncodeULEB128(Value, OSE, Padding);
|
||||
EmitBytes(OSE.str(), AddrSpace);
|
||||
}
|
||||
|
||||
|
@ -3,13 +3,11 @@ target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-
|
||||
target triple = "thumbv7-apple-macosx10.6.7"
|
||||
|
||||
;CHECK: DW_OP_regx for Q register: D1
|
||||
;CHECK-NEXT: byte
|
||||
;CHECK-NEXT: byte
|
||||
;CHECK-NEXT: ascii
|
||||
;CHECK-NEXT: DW_OP_piece 8
|
||||
;CHECK-NEXT: byte 8
|
||||
;CHECK-NEXT: DW_OP_regx for Q register: D2
|
||||
;CHECK-NEXT: byte
|
||||
;CHECK-NEXT: byte
|
||||
;CHECK-NEXT: ascii
|
||||
;CHECK-NEXT: DW_OP_piece 8
|
||||
;CHECK-NEXT: byte 8
|
||||
|
||||
|
@ -2,8 +2,7 @@
|
||||
; Radar 9309221
|
||||
; Test dwarf reg no for s16
|
||||
;CHECK: DW_OP_regx for S register
|
||||
;CHECK-NEXT: byte
|
||||
;CHECK-NEXT: byte
|
||||
;CHECK-NEXT: ascii
|
||||
;CHECK-NEXT: DW_OP_bit_piece 32 0
|
||||
|
||||
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
|
||||
|
@ -16,7 +16,7 @@
|
||||
; CHECK-NEXT: .byte 6 ## DW_FORM_data4
|
||||
; CHECK-NEXT: .byte 27 ## DW_AT_comp_dir
|
||||
; CHECK-NEXT: .byte 14 ## DW_FORM_strp
|
||||
; CHECK-NEXT: .byte 225 ## DW_AT_APPLE_optimized
|
||||
; CHECK-NEXT: .ascii "\341\177" ## DW_AT_APPLE_optimized
|
||||
|
||||
%struct.a = type { i32, %struct.a* }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user