mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
LLVM always prints IR constants as signed decimal, which is not ideal when looking for packed bit patterns in tests. Add a little filter script that turns hex constants of the form `<iNN 0xNNNNN>` into the decimal output we'd expect from the LLVM printer.
32 lines
1.0 KiB
Python
Executable File
32 lines
1.0 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Check HEX -- a stupid filter that allows hexadecimal literals to be checked
|
|
# for in LLVM IR FileCheck tests. It works by replacing occurrences of
|
|
# strings matching the regex /< (i[0-9]+) \s+ (0x[0-9A-Fa-f]+) >/x with the
|
|
# decimal literal equivalent that would really appear in printed LLVM IR.
|
|
|
|
from __future__ import print_function
|
|
|
|
import re
|
|
import sys
|
|
|
|
hex = re.compile(r"""<(i([0-9]+)\s+)0x([0-9A-Fa-f_]+)>""")
|
|
|
|
|
|
def hexReplace(match):
|
|
# Integer type is match group 1
|
|
ty = match.group(1)
|
|
# Integer bit width is match group 2
|
|
bits = int(match.group(2))
|
|
# Hex value is match group 3
|
|
value = int(match.group(3).replace("_", ""), base=16)
|
|
# LLVM prints the decimal value as if it's two's-complement signed in
|
|
# the given bitwidth, so the printed value will be negative if
|
|
# greater than 2^(bits - 1)
|
|
if value >= (1 << (bits - 1)):
|
|
value -= 1 << bits
|
|
return ty + str(value)
|
|
|
|
|
|
for line in sys.stdin:
|
|
print(re.sub(hex, hexReplace, line), end="")
|