[libc] Make hdrgen support macro_header YAML field. (#123265)
A macro can specify macro_header instead of macro_value to indicate that an llvm-libc-macros/ header file is supposed to define this macro. This is used for dlfcn.h, which previously bogusly redefined the RTLD_* macros to empty.
This commit is contained in:
@@ -2,13 +2,13 @@ header: dlfcn.h
|
||||
header_template: dlfcn.h.def
|
||||
macros:
|
||||
- macro_name: RTLD_LAZY
|
||||
macro_value: null
|
||||
macro_header: dlfcn-macros.h
|
||||
- macro_name: RTLD_NOW
|
||||
macro_value: null
|
||||
macro_header: dlfcn-macros.h
|
||||
- macro_name: RTLD_GLOBAL
|
||||
macro_value: null
|
||||
macro_header: dlfcn-macros.h
|
||||
- macro_name: RTLD_LOCAL
|
||||
macro_value: null
|
||||
macro_header: dlfcn-macros.h
|
||||
types: []
|
||||
enums: []
|
||||
objects: []
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
from header import HeaderFile
|
||||
|
||||
|
||||
class GpuHeaderFile(HeaderFile):
|
||||
def __str__(self):
|
||||
content = []
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#
|
||||
# ==-------------------------------------------------------------------------==#
|
||||
|
||||
from pathlib import PurePath
|
||||
|
||||
|
||||
class HeaderFile:
|
||||
def __init__(self, name):
|
||||
@@ -32,11 +34,26 @@ class HeaderFile:
|
||||
def add_function(self, function):
|
||||
self.functions.append(function)
|
||||
|
||||
def includes(self):
|
||||
return sorted(
|
||||
{
|
||||
PurePath("llvm-libc-macros") / macro.header
|
||||
for macro in self.macros
|
||||
if macro.header is not None
|
||||
}
|
||||
)
|
||||
|
||||
def public_api(self):
|
||||
content = [""]
|
||||
header_dir = PurePath(self.name).parent
|
||||
content = [
|
||||
f'#include "{file.relative_to(header_dir)}"' for file in self.includes()
|
||||
] + [""]
|
||||
|
||||
for macro in self.macros:
|
||||
content.append(f"{macro}\n")
|
||||
# When there is nothing to define, the Macro object converts to str
|
||||
# as an empty string. Don't emit a blank line for those cases.
|
||||
if str(macro):
|
||||
content.append(f"{macro}\n")
|
||||
|
||||
for type_ in self.types:
|
||||
content.append(f"{type_}")
|
||||
@@ -76,11 +93,9 @@ class HeaderFile:
|
||||
content.append(f"#endif // {current_guard}")
|
||||
content.append("")
|
||||
|
||||
for object in self.objects:
|
||||
content.append(str(object))
|
||||
content.extend(str(object) for object in self.objects)
|
||||
if self.objects:
|
||||
content.append("\n__END_C_DECLS")
|
||||
else:
|
||||
content.append("__END_C_DECLS")
|
||||
content.append("")
|
||||
content.append("__END_C_DECLS")
|
||||
|
||||
return "\n".join(content)
|
||||
|
||||
@@ -8,12 +8,14 @@
|
||||
|
||||
|
||||
class Macro:
|
||||
def __init__(self, name, value=None):
|
||||
def __init__(self, name, value=None, header=None):
|
||||
self.name = name
|
||||
self.value = value
|
||||
self.header = header
|
||||
|
||||
def __str__(self):
|
||||
if self.header != None:
|
||||
return ""
|
||||
if self.value != None:
|
||||
return f"#define {self.name} {self.value}"
|
||||
else:
|
||||
return f"#define {self.name}"
|
||||
return f"#define {self.name}"
|
||||
|
||||
@@ -11,13 +11,17 @@
|
||||
|
||||
#include "__llvm-libc-common.h"
|
||||
#include "llvm-libc-macros/float16-macros.h"
|
||||
#include "llvm-libc-macros/test_small-macros.h"
|
||||
#include "llvm-libc-types/float128.h"
|
||||
|
||||
#include "llvm-libc-macros/test_more-macros.h"
|
||||
#include "llvm-libc-macros/test_small-macros.h"
|
||||
|
||||
#define MACRO_A 1
|
||||
|
||||
#define MACRO_B 2
|
||||
|
||||
#define MACRO_C
|
||||
|
||||
#include <llvm-libc-types/type_a.h>
|
||||
#include <llvm-libc-types/type_b.h>
|
||||
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
|
||||
#include "__llvm-libc-common.h"
|
||||
#include "llvm-libc-macros/float16-macros.h"
|
||||
#include "llvm-libc-macros/test_small-macros.h"
|
||||
#include "llvm-libc-types/float128.h"
|
||||
|
||||
%%public_api()
|
||||
|
||||
@@ -5,6 +5,11 @@ macros:
|
||||
macro_value: 1
|
||||
- macro_name: MACRO_B
|
||||
macro_value: 2
|
||||
- macro_name: MACRO_C
|
||||
- macro_name: MACRO_D
|
||||
macro_header: test_small-macros.h
|
||||
- macro_name: MACRO_E
|
||||
macro_header: test_more-macros.h
|
||||
types:
|
||||
- type_name: type_a
|
||||
- type_name: type_b
|
||||
|
||||
@@ -10,6 +10,7 @@ class TestHeaderGenIntegration(unittest.TestCase):
|
||||
self.output_dir = TestHeaderGenIntegration.output_dir
|
||||
self.source_dir = Path(__file__).parent
|
||||
self.main_script = self.source_dir.parent / "main.py"
|
||||
self.maxDiff = 80 * 100
|
||||
|
||||
def run_script(self, yaml_file, output_file, entry_points):
|
||||
command = [
|
||||
|
||||
@@ -38,7 +38,13 @@ def yaml_to_classes(yaml_data, header_class, entry_points=None):
|
||||
header.template_file = yaml_data.get("header_template")
|
||||
|
||||
for macro_data in yaml_data.get("macros", []):
|
||||
header.add_macro(Macro(macro_data["macro_name"], macro_data["macro_value"]))
|
||||
header.add_macro(
|
||||
Macro(
|
||||
macro_data["macro_name"],
|
||||
macro_data.get("macro_value"),
|
||||
macro_data.get("macro_header"),
|
||||
)
|
||||
)
|
||||
|
||||
types = yaml_data.get("types", [])
|
||||
sorted_types = sorted(types, key=lambda x: x["type_name"])
|
||||
|
||||
Reference in New Issue
Block a user