summaryrefslogtreecommitdiff
path: root/user/llvm18/dwarf-info.patch
blob: 9357c6519cf706b8a20d53d22da717ff42e8cd32 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Author: A. Wilcox <awilfox@adelielinux.org>

This isn't the proper fix, but debugging the LLVM formatter is a bit
above my paygrade at the moment.

The issue shows up in the DWARF X86 test on ppc and armv7:

error: Simplified template DW_AT_name could not be reconstituted:
         original: f3<char, '\x00', '\x01', '\x06', '\a', '\r', '\x0e', '\x1f', ' ', '!', '\x7f', '\x80'>
    reconstituted: f3<char, '\x00', '\x00', '\x00', '\a', '\r', '\x00', '\x00', ' ', '!', '\x00', '\x00'>

With this patch, this error does not occur.  Debugging shows that the
llvm::format overload called in the error case is <long long>, so I
think it is having an issue converting a 64-bit value on platforms
where char is default-unsigned.

(pmmx does not show this issue, and has signed char.)
--- llvm-14.0.6.src/lib/DebugInfo/DWARF/DWARFDie.cpp.old	2022-06-22 16:46:24.000000000 +0000
+++ llvm-14.0.6.src/lib/DebugInfo/DWARF/DWARFDie.cpp	2022-11-28 10:32:05.573627744 +0000
@@ -506,7 +506,7 @@
               OS << (char)Val;
               OS << "'";
             } else if (Val < 256)
-              OS << to_string(llvm::format("'\\x%02x'", Val));
+              OS << to_string(llvm::format("'\\x%02x'", (unsigned char)Val));
             else if (Val <= 0xFFFF)
               OS << to_string(llvm::format("'\\u%04x'", Val));
             else