#!/usr/bin/env python # ===-- klee-clang --------------------------------------------------------===## # # The KLEE Symbolic Virtual Machine # # This file is distributed under the University of Illinois Open Source # License. See LICENSE.TXT for details. # # ===----------------------------------------------------------------------===## import os, sys import subprocess import re def isLinkCommand(): # Look for '-Wl,' as a signal that we are calling the linker. What a hack. for arg in sys.argv: if arg.startswith('-Wl,'): return True link_exact_filter = ['-g', '-W', '-O', '-D', '-f', '-fnested-functions', '-pthread', '-fPIC', '-g', '-pedantic', '-shared', '-rdynamic', '-nodefaultlibs'] link_regexp_filter_patts = ['^-Wl.*', '^-l.*', '^-W.*', '^-O\d', '^-gg.*', '^-mtune.*', '^-std=c.*', '^-f.*frame-pointer', '^-fvisibility.*'] link_regexp_filters = [] for patt in link_regexp_filter_patts: prog = re.compile(patt) link_regexp_filters.append(prog) def main(): llvm_path = subprocess.Popen(["llvm-config", "--bindir"], stdout=subprocess.PIPE).communicate()[0].strip() if not isLinkCommand(): os.execvp(llvm_path+"/clang", ["clang", "-emit-llvm", "-c"] + sys.argv[1:]) return 1 # Otherwise, strip out arguments that llvm-ld doesn't understand. I don't # want my previous explicit declaration of hackyness to imply that this bit # of code here is not also a complete and total hack, it is. args = sys.argv[1:] linkArgs = [] for a in args: a = a.strip() if a in link_exact_filter: continue match = False for filt in link_regexp_filters: # print "matching %s on filter" % a if filt.match(a): # print "MATCHED %s" % a match = True break if match: continue if a in linkArgs: continue linkArgs.append(a) os.execvp(llvm_path+"/llvm-link", [llvm_path+"/llvm-link"] + linkArgs) return 1 if __name__ == '__main__': main()