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