| 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()) |