aboutsummaryrefslogtreecommitdiff
path: root/emld
blob: 954465c6f0ce84513cf520290c2a971d88471567 (plain)
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
#!/usr/bin/env python

'''
emld - linker helper script
===========================

This script acts as a frontend replacement for the ld linker. See emcc.

We could use the compiler code for this, but here we want to be careful to use all the linker flags we have been passed, sending them to ld.
'''

import os, sys
from tools import shared

DEBUG = os.environ.get('EMCC_DEBUG')

if DEBUG:
  print >> sys.stderr, 'emld:', sys.argv

ALLOWED_LINK_ARGS = ['-f', '-help', '-o', '-print-after', '-print-after-all', '-print-before',
                     '-print-before-all', '-time-passes', '-v', '-verify-dom-info', '-version' ]
TWO_PART_DISALLOWED_LINK_ARGS = ['-L'] # Ignore thingsl like |-L .|

# Check for specified target
target = None
for i in range(len(sys.argv)-1):
  if sys.argv[i].startswith('-o='):
    raise Exception('Invalid syntax: do not use -o=X, use -o X')

  if sys.argv[i] == '-o':
    target = sys.argv[i+1]
    sys.argv = sys.argv[:i] + sys.argv[i+2:]
    break

call = shared.LLVM_LD
newargs = ['-disable-opt']
i = 0
while i < len(sys.argv)-1:
  i += 1
  arg = sys.argv[i]
  if arg.startswith('-'):
    prefix = arg.split('=')[0]
    if prefix in ALLOWED_LINK_ARGS:
      newargs.append(arg)
    if arg in TWO_PART_DISALLOWED_LINK_ARGS:
      i += 1
  elif arg.endswith('.so'):
    continue # .so's do not exist yet, in many cases
  else:
    # not option, so just append
    newargs.append(arg)
if target:
  actual_target = target
  if target.endswith('.js'):
    actual_target = unsuffixed(target) + '.bc'
  newargs.append('-o=' + actual_target)

if DEBUG: print >> sys.stderr, "emld running:", call, ' '.join(newargs)
os.execvp(call, [call] + newargs)