Index: pnacl/driver/pnacl-translate.py |
diff --git a/pnacl/driver/pnacl-translate.py b/pnacl/driver/pnacl-translate.py |
index 2279919761cb4b967e45732e8bcc93c584c84de0..8d7d65a3cf054b8c099f2072723426f1e3fe022c 100755 |
--- a/pnacl/driver/pnacl-translate.py |
+++ b/pnacl/driver/pnacl-translate.py |
@@ -12,6 +12,7 @@ |
import driver_tools |
import filetype |
import ldtools |
+import os |
import pathtools |
import shutil |
from driver_env import env |
@@ -97,6 +98,7 @@ EXTRA_ENV = { |
'TRIPLE_X8632': 'i686-none-nacl-gnu', |
'TRIPLE_X8664': 'x86_64-none-nacl-gnu', |
'TRIPLE_MIPS32': 'mipsel-none-nacl-gnu', |
+ 'TRIPLE_LINUX_X8632': 'i686-linux-gnu', |
'LLC_FLAGS_COMMON': '${PIC ? -relocation-model=pic} ' + |
# -force-tls-non-pic makes the code generator (llc) |
@@ -119,6 +121,11 @@ EXTRA_ENV = { |
'LLC_FLAGS_MIPS32': '-sfi-load -sfi-store -sfi-stack -sfi-branch -sfi-data', |
+ # When linking against Linux glibc, don't use %gs:0 to read the |
+ # thread pointer because that's not compatible with glibc's use of |
+ # %gs. |
+ 'LLC_FLAGS_LINUX_X8632' : '-mtls-use-call', |
+ |
# LLC flags which set the target and output type. |
'LLC_FLAGS_TARGET' : '-mtriple=${TRIPLE} -filetype=${outfiletype}', |
@@ -131,16 +138,15 @@ EXTRA_ENV = { |
'OPT_LEVEL' : '', |
# faster translation == slower code |
- 'LLC_FLAGS_FAST' : '${LLC_FLAGS_FAST_%ARCH%}', |
+ 'LLC_FLAGS_FAST' : '${LLC_FLAGS_FAST_%ARCH%}' |
+ # This, surprisingly, makes a measurable difference |
+ ' -tail-merge-threshold=20', |
- 'LLC_FLAGS_FAST_X8632': '-O0 ' + |
- # This, surprisingly, makes a measurable difference |
- '-tail-merge-threshold=20', |
- 'LLC_FLAGS_FAST_X8664': '-O0 ' + |
- '-tail-merge-threshold=20', |
- 'LLC_FLAGS_FAST_ARM': '-O0 ' + |
- '-tail-merge-threshold=20', |
- 'LLC_FLAGS_FAST_MIPS32': '-fast-isel -tail-merge-threshold=20', |
+ 'LLC_FLAGS_FAST_X8632': '-O0 ', |
+ 'LLC_FLAGS_FAST_X8664': '-O0 ', |
+ 'LLC_FLAGS_FAST_ARM': '-O0 ', |
+ 'LLC_FLAGS_FAST_MIPS32': '-fast-isel', |
+ 'LLC_FLAGS_FAST_LINUX_X8632': '-O0', |
'LLC_FLAGS': '${LLC_FLAGS_TARGET} ${LLC_FLAGS_COMMON} ${LLC_FLAGS_%ARCH%} ' + |
'${LLC_FLAGS_EXTRA}', |
@@ -156,6 +162,7 @@ EXTRA_ENV = { |
'LLC_MCPU_X8632' : 'pentium4', |
'LLC_MCPU_X8664' : 'core2', |
'LLC_MCPU_MIPS32' : 'mips32r2', |
+ 'LLC_MCPU_LINUX_X8632' : '${LLC_MCPU_X8632}', |
# Note: this is only used in the unsandboxed case |
'RUN_LLC' : '${LLVM_PNACL_LLC} ${LLC_FLAGS} ${LLC_MCPU} ' |
@@ -306,7 +313,10 @@ def main(argv): |
env.set('STATIC', '1') |
assert output_type in ('so','nexe') |
- RunLD(ofile, output) |
+ if env.getone('ARCH') == 'LINUX_X8632': |
+ RunHostLD(ofile, output) |
+ else: |
+ RunLD(ofile, output) |
return 0 |
def RunAS(infile, outfile): |
@@ -388,6 +398,13 @@ def RunLD(infile, outfile): |
args += env.get('LD_FLAGS') |
driver_tools.RunDriver('nativeld', args) |
+def RunHostLD(infile, outfile): |
+ driver_tools.Run(['objcopy', '--redefine-sym', '_start=_user_start', infile]) |
+ lib_dir = env.getone('BASE_LIB_NATIVE') + 'linux-x86-32' |
+ driver_tools.Run(['gcc', '-m32', infile, |
+ os.path.join(lib_dir, 'unsandboxed_irt.o'), |
+ '-o', outfile]) |
+ |
def RunLLC(infile, outfile, outfiletype): |
env.push() |
env.setmany(input=infile, output=outfile, outfiletype=outfiletype) |