| #!/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() |