[tools] Allow for pointer-to-integer types in .def files

The upcoming futex syscalls will be easier to use (and to auto verify)
if passed a pointer instead of an address, this allows for changing a
`Primitive` to a `PrimitiveRef` by adding a `*` to the end.
This commit is contained in:
Justin C. Miller
2023-02-26 11:22:44 -08:00
parent 95627ba43c
commit 1d7d5e8015
3 changed files with 30 additions and 24 deletions

View File

@@ -35,7 +35,7 @@ name: IDENTIFIER
options: "[" ( OPTION | IDENTIFIER )+ "]"
description: COMMENT+
PRIMITIVE: INT_TYPE | "size" | "string" | "buffer" | "address"
PRIMITIVE: INT_TYPE "*"? | "size" | "string" | "buffer" | "address"
INT_TYPE: /u?int(8|16|32|64)?/
NUMBER: /(0x)?[0-9a-fA-F]+/
UID: /[0-9a-fA-F]{16}/

File diff suppressed because one or more lines are too long

View File

@@ -42,31 +42,37 @@ class PrimitiveRef(Primitive):
def cxx_names(self, options):
return self.c_names(options)
_inttypes = {
"int": "int",
"uint": "unsigned",
"size": "size_t",
"address": "uintptr_t",
"int8": "int8_t",
"uint8": "uint8_t",
"int16": "int16_t",
"uint16": "uint16_t",
"int32": "int32_t",
"uint32": "uint32_t",
"int64": "int64_t",
"uint64": "uint64_t",
}
_primitives = {
"string": PrimitiveRef("string", "char"),
"buffer": PrimitiveRef("buffer", "void", counted=True),
"int": Primitive("int", "int"),
"uint": Primitive("uint", "unsigned"),
"size": Primitive("size", "size_t"),
"address": Primitive("address", "uintptr_t"),
"int8": Primitive("int8", "int8_t"),
"uint8": Primitive("uint8", "uint8_t"),
"int16": Primitive("int16", "int16_t"),
"uint16": Primitive("uint16", "uint16_t"),
"int32": Primitive("int32", "int32_t"),
"uint32": Primitive("uint32", "uint32_t"),
"int64": Primitive("int64", "int64_t"),
"uint64": Primitive("uint64", "uint64_t"),
}
def get_primitive(name):
p = _primitives.get(name)
if not p:
from ..errors import InvalidType
raise InvalidType(name)
return p
if p: return p
it = _inttypes.get(name.replace('*', ''))
if it:
if '*' in name:
return PrimitiveRef(name, it)
else:
return Primitive(name, it)
from ..errors import InvalidType
raise InvalidType(name)