Hex escapes of the form \xff are not universally supported in the printf
implementations on the platforms that LLVM runs on (although they
apparently are in the shell builtins). Octal escapes are required to be
supported by POSIX. This patch converts all hex escapes to octal escapes
for compatibility reasons.
This came up when trying to turn on lit's internal shell by default for
llvm/. We started using /usr/bin/printf instead of the shell builtin on
MacOS, which does not support hex escapes.
I used the following python script to automate most of the conversion
with a few manual touchups needed:
```py
import sys
def process_line(to_process: str):
output = ""
i = 0
while i < len(to_process):
if to_process[i:i+2] == '\\x':
hex_string = to_process[i+2:i+4]
number = int(hex_string, 16)
output += "\\"
octal_string = oct(number)[2:]
if len(octal_string) == 1:
octal_string = "00" + octal_string
elif len(octal_string) == 2:
octal_string = "0" + octal_string
assert(len(octal_string) == 3)
output += octal_string
i += 4
else:
output += to_process[i]
i += 1
return output
with open(sys.argv[1]) as input_file:
lines = input_file.readlines()
for i, _ in enumerate(lines):
lines[i] = process_line(lines[i])
with open(sys.argv[1], 'w') as output_file:
output_file.writelines(lines)
```
89 lines
3.7 KiB
Plaintext
89 lines
3.7 KiB
Plaintext
// Header
|
|
//
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, Magic, __llvm_profile_get_magic())
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, Version, __llvm_profile_get_version())
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, BinaryIdsSize, __llvm_write_binary_ids(NULL))
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, DataSize, DataSize)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, CountersSize, CountersSize)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, NumBitmaskBytes, NumBitmaskBytes)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, NamesSize, NamesSize)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, CountersDelta, (uintptr_t)CountersBegin)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, BitmaskDelta, (uintptr_t)BitmaskBegin)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, NamesDelta, (uintptr_t)NamesBegin)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, VNamesSize, VNamesSize)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, NumVTables, NumVTables)
|
|
// INSTR_PROF_RAW_HEADER(uint64_t, ValueKindLast, IPVK_Last)
|
|
|
|
// gnuwin32 printf does not work for this test because it will print \15 (CR)
|
|
// whenever \12 (LF) is in the input string.
|
|
UNSUPPORTED: system-windows
|
|
RUN: printf '\201rforpl\377' > %t.profraw
|
|
RUN: printf '\12\0\0\0\0\0\0\0' >> %t.profraw
|
|
// There will be 2 20-byte binary IDs, so the total Binary IDs size will be 64 bytes.
|
|
// 2 * 8 binary ID sizes
|
|
// + 2 * 20 binary IDs (of size 20)
|
|
// + 2 * 4 binary ID paddings
|
|
// --------
|
|
// = 64 bytes
|
|
RUN: printf '\100\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\2\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\3\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\20\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\4\0\1\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\4\0\2\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
|
|
// Binary IDs - There are only two in this case that are 20 bytes.
|
|
RUN: printf '\24\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\1\2\3\4\5\6\7' >> %t.profraw
|
|
RUN: printf '\0\1\2\3\4\5\6\7' >> %t.profraw
|
|
RUN: printf '\0\1\2\3\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\24\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\1\1\1\1\1\1\1\1' >> %t.profraw
|
|
RUN: printf '\2\2\2\2\2\2\2\2' >> %t.profraw
|
|
RUN: printf '\3\3\3\3\0\0\0\0' >> %t.profraw
|
|
|
|
// Data Section
|
|
//
|
|
// struct ProfData {
|
|
// #define INSTR_PROF_DATA(Type, LLVMType, Name, Initializer) \
|
|
// Type Name;
|
|
// #include "llvm/ProfileData/InstrProfData.inc"
|
|
// };
|
|
|
|
RUN: printf '\254\275\030\333\114\302\370\134' >> %t.profraw
|
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\4\0\1\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\1\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
|
|
RUN: printf '\067\265\035\031\112\165\023\344' >> %t.profraw
|
|
RUN: printf '\02\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\310\377\3\0\1\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\02\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\0\0\0\0\0\0\0\0' >> %t.profraw
|
|
|
|
RUN: printf '\023\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\067\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\101\0\0\0\0\0\0\0' >> %t.profraw
|
|
RUN: printf '\7\0foo\1bar\0\0\0\0\0\0\0' >> %t.profraw
|
|
|
|
// RUN: llvm-profdata show --binary-ids %t.profraw | FileCheck %s
|
|
// CHECK: Instrumentation level: Front-end
|
|
// CHECK: Binary IDs:
|
|
// CHECK-NEXT: 0001020304050607000102030405060700010203
|
|
// CHECK-NEXT: 0101010101010101020202020202020203030303
|