about summary refs log tree commit diff homepage
path: root/scripts/klee-clang
blob: 7b98a97d16bb9e4db7fafabd61b03f2e27a90bfe (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/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()