|  | #!/usr/bin/env python | 
|  |  | 
|  | import subprocess | 
|  | import difflib | 
|  |  | 
|  | def capture_2(args0, args1): | 
|  | import subprocess | 
|  | p0 = subprocess.Popen(args0, stdin=None, stdout=subprocess.PIPE, | 
|  | stderr=subprocess.PIPE) | 
|  | p1 = subprocess.Popen(args1, stdin=p0.stdout, stdout=subprocess.PIPE, | 
|  | stderr=subprocess.PIPE) | 
|  | out,_ = p1.communicate() | 
|  | return out | 
|  |  | 
|  | def normalize_nm(data): | 
|  | lines = data.split('\n') | 
|  | lines.sort() | 
|  |  | 
|  | # FIXME: Ignore common symbols for now. | 
|  | lines = [ln for ln in lines | 
|  | if not ln.startswith('         C')] | 
|  |  | 
|  | return lines | 
|  |  | 
|  | def main(): | 
|  | import sys | 
|  | clang = sys.argv[1] | 
|  | flags = sys.argv[2:] | 
|  |  | 
|  | # FIXME: Relax to include undefined symbols. | 
|  | nm_args = ["llvm-nm", "-extern-only", "-defined-only"] | 
|  |  | 
|  | llvmgcc_args = ["llvm-gcc"] + flags + ["-emit-llvm","-c","-o","-"] | 
|  | clang_args = [clang] + flags + ["-emit-llvm","-c","-o","-"] | 
|  |  | 
|  | llvmgcc_nm = capture_2(llvmgcc_args, nm_args) | 
|  | clang_nm = capture_2(clang_args, nm_args) | 
|  |  | 
|  | llvmgcc_nm = normalize_nm(llvmgcc_nm) | 
|  | clang_nm = normalize_nm(clang_nm) | 
|  |  | 
|  | if llvmgcc_nm == clang_nm: | 
|  | sys.exit(0) | 
|  |  | 
|  | print ' '.join(llvmgcc_args), '|', ' '.join(nm_args) | 
|  | print ' '.join(clang_args), '|', ' '.join(nm_args) | 
|  | for line in difflib.unified_diff(llvmgcc_nm, clang_nm, | 
|  | fromfile="llvm-gcc symbols", | 
|  | tofile="clang symbols"): | 
|  | print line | 
|  | sys.exit(1) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | main() |