mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			68 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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())
 | 
