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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
#!/usr/bin/env python3
# Copyright (c) Meta Platforms, Inc. and affiliates.
# SPDX-License-Identifier: LGPL-2.1-or-later
import argparse
import re
import subprocess
import sys
def main() -> None:
argparse.ArgumentParser(description="Generate elf.py from elf.h").parse_args()
contents = subprocess.check_output(
["gcc", "-dD", "-E", "-"],
input="#include <elf.h>\n",
universal_newlines=True,
)
enums = {
name: []
for name in (
"ET",
"PT",
"SHF",
"SHN",
"SHT",
"STB",
"STT",
"STV",
)
}
for match in re.finditer(
r"^\s*#\s*define\s+(?P<enum>"
+ "|".join(enums)
+ r")_(?P<name>\w+)\s+(?:(?P<value>0x[0-9a-fA-F]+|[0-9]+)|(?:\(\s*1U?\s*<<\s*(?P<bitshift>[0-9]+)\s*\)))",
contents,
re.MULTILINE,
):
enum = match.group("enum")
name = match.group("name")
if match.group("value"):
value = int(match.group("value"), 0)
else:
value = 1 << int(match.group("bitshift"), 10)
enums[enum].append((name, value))
f = sys.stdout
f.write(
"""\
# Copyright (c) Meta Platforms, Inc. and affiliates.
# SPDX-License-Identifier: LGPL-2.1-or-later
# Generated by scripts/gen_elf_py.py.
import enum
"""
)
for type_name, constants in enums.items():
assert constants
enum_class = "IntFlag" if type_name == "SHF" else "IntEnum"
f.write(f"\n\nclass {type_name}(enum.{enum_class}):\n")
for name, value in constants:
f.write(f" {name} = 0x{value:X}\n")
if __name__ == "__main__":
main()
|