| #!/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="") |