rust/tools/check_intrinsics_duplicates.py

68 lines
2.4 KiB
Python
Raw Normal View History

import sys
def check_duplicates():
auto_content = ""
manual_content = ""
with open("src/intrinsic/llvm.rs", "r", encoding="utf8") as f:
manual_content = f.read()
with open("src/intrinsic/archs.rs", "r", encoding="utf8") as f:
auto_content = f.read()
intrinsics_map = {}
for line in auto_content.splitlines():
line = line.strip()
if not line.startswith('"'):
continue
parts = line.split('"')
if len(parts) != 5:
continue
intrinsics_map[parts[1]] = parts[3]
if len(intrinsics_map) == 0:
print("No intrinsics found in auto code... Aborting.")
return 1
print("Found {} intrinsics in auto code".format(len(intrinsics_map)))
errors = []
lines = manual_content.splitlines()
pos = 0
found = 0
while pos < len(lines):
line = lines[pos].strip()
# This is our marker.
if line == "let gcc_name = match name {":
while pos < len(lines):
line = lines[pos].strip()
pos += 1
if line == "};":
# We're done!
if found == 0:
print("No intrinsics found in manual code even though we found the "
"marker... Aborting...")
return 1
for error in errors:
print("ERROR => {}".format(error))
return 1 if len(errors) != 0 else 0
parts = line.split('"')
if len(parts) != 5:
continue
found += 1
if parts[1] in intrinsics_map:
if parts[3] != intrinsics_map[parts[1]]:
print("Same intrinsics (`{}` at line {}) but different GCC "
"translations: `{}` != `{}`".format(
parts[1], pos, intrinsics_map[parts[1]], parts[3]))
else:
errors.append("Duplicated intrinsics: `{}` at line {}. Please remove it "
" from manual code".format(parts[1], pos))
# Weird but whatever...
return 1 if len(errors) != 0 else 0
pos += 1
print("No intrinsics found in manual code... Aborting")
return 1
if __name__ == "__main__":
sys.exit(check_duplicates())