| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # Copyright 2009 The Native Client Authors. All rights reserved. | 2 # Copyright 2009 The Native Client Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can | 3 # Use of this source code is governed by a BSD-style license that can |
| 4 # be found in the LICENSE file. | 4 # be found in the LICENSE file. |
| 5 | 5 |
| 6 # this script is a replacement for llvm-gcc and llvm-g++ driver. | 6 # this script is a replacement for llvm-gcc and llvm-g++ driver. |
| 7 # It detects automatically which role it is supposed to assume. | 7 # It detects automatically which role it is supposed to assume. |
| 8 # The point of the script is to redirect builds through our own tools, | 8 # The point of the script is to redirect builds through our own tools, |
| 9 # while making these tools appear like gnu tools. | 9 # while making these tools appear like gnu tools. |
| 10 # | 10 # |
| 11 # Compared to the gcc driver the usage patterns of this script | 11 # Compared to the gcc driver the usage patterns of this script |
| 12 # are somewhat restricted: | 12 # are somewhat restricted: |
| 13 # * you cannot compile and link at the same time | 13 # * you cannot compile and link at the same time |
| 14 # * you cannot specify multiple source files in one invocation | 14 # * you cannot specify multiple source files in one invocation |
| 15 # * ... | 15 # * ... |
| 16 # | 16 # |
| 17 | 17 |
| 18 | 18 |
| 19 import os | 19 import os |
| 20 import struct | 20 import struct |
| 21 import subprocess | 21 import subprocess |
| 22 import sys | 22 import sys |
| 23 | 23 |
| 24 # enable this for manual debugging of this script only | 24 # enable this for manual debugging of this script only |
| 25 # NOTE: this HAS to be zero in order to work with the llvm-gcc | 25 # NOTE: this HAS to be zero in order to work with the llvm-gcc |
| 26 # bootstrapping process | 26 # bootstrapping process |
| 27 VERBOSE = 0 | 27 VERBOSE = 1 |
| 28 TOLERATE_COMPILATION_OF_ASM_CODE = 1 | 28 TOLERATE_COMPILATION_OF_ASM_CODE = 1 |
| 29 # NOTE: set this to something like: | 29 # NOTE: set this to something like: |
| 30 OUT = open('/tmp/fake.log', 'a') | 30 OUT = open('/tmp/fake.log', 'a') |
| 31 # if you want a log of all the action. otherwise: | 31 # if you want a log of all the action. otherwise: |
| 32 #OUT = None | 32 #OUT = None |
| 33 | 33 |
| 34 ###################################################################### | 34 ###################################################################### |
| 35 # Misc | 35 # Misc |
| 36 ###################################################################### | 36 ###################################################################### |
| 37 | 37 |
| 38 BASE = os.path.dirname(os.path.dirname(sys.argv[0])) | 38 BASE = os.path.dirname(os.path.dirname(sys.argv[0])) |
| 39 | 39 |
| 40 LD_SCRIPT_ARM = BASE + '/arm-none-linux-gnueabi/ld_script_arm_untrusted' | 40 LD_SCRIPT_ARM = BASE + '/arm-none-linux-gnueabi/ld_script_arm_untrusted' |
| 41 | 41 |
| 42 # TODO(robertm) clean this up | 42 # TODO(robertm) clean this up |
| 43 LD_SCRIPT_X8632 = BASE + '/../../tools/llvm/ld_script_x86_untrusted' | 43 LD_SCRIPT_X8632 = BASE + '/../../tools/llvm/ld_script_x86_untrusted' |
| 44 | 44 |
| 45 # arm libgcc | 45 # arm libgcc |
| 46 LIBDIR_ARM_1 = BASE + '/armsfi-lib' | 46 LIBDIR_ARM_1 = BASE + '/armsfi-lib' |
| 47 | 47 |
| 48 # arm startup code + libs (+ bitcode when in bitcode mode) | 48 # arm startup code + libs (+ bitcode when in bitcode mode) |
| 49 LIBDIR_ARM_2 = BASE + '/arm-newlib/arm-none-linux-gnueabi/lib' | 49 LIBDIR_ARM_2 = BASE + '/arm-newlib/arm-none-linux-gnueabi/lib' |
| 50 | 50 |
| 51 # x86 libgcc | 51 # x86 libgcc |
| 52 LIBDIR_X8632_1 = BASE + '/../linux_x86/sdk/nacl-sdk/nacl64/lib/32' | 52 LIBDIR_X8632_2 = BASE + '/../linux_x86/sdk/nacl-sdk/nacl64/lib/32' |
| 53 | 53 |
| 54 # x86 startup code | 54 # x86 startup code |
| 55 LIBDIR_X8632_2 = BASE + '/../linux_x86/sdk/nacl-sdk/lib/gcc/nacl64/4.4.3/32/' | 55 LIBDIR_X8632_1 = BASE + '/../linux_x86/sdk/nacl-sdk/lib/gcc/nacl64/4.4.3/32/' |
| 56 | 56 |
| 57 # NOTE: ugly work around for some llvm-ld shortcomings: | 57 # NOTE: ugly work around for some llvm-ld shortcomings: |
| 58 # we need to keep some symbols alive which are referenced by | 58 # we need to keep some symbols alive which are referenced by |
| 59 # native code libraries linked in at the very end | 59 # native code libraries linked in at the very end |
| 60 REACHABLE_FUNCTION_SYMBOLS = LIBDIR_ARM_2 + '/reachable_function_symbols.o' | 60 REACHABLE_FUNCTION_SYMBOLS = LIBDIR_ARM_2 + '/reachable_function_symbols.o' |
| 61 | 61 |
| 62 # Note: this works around an assembler bug that has been fixed only recently | 62 # Note: this works around an assembler bug that has been fixed only recently |
| 63 # We probably can drop this once we have switched to codesourcery 2009Q4 | 63 # We probably can drop this once we have switched to codesourcery 2009Q4 |
| 64 HACK_ASM = ['sed', '-e', 's/vmrs.*apsr_nzcv, fpscr/fmrx r15, fpscr/g'] | 64 HACK_ASM = ['sed', '-e', 's/vmrs.*apsr_nzcv, fpscr/fmrx r15, fpscr/g'] |
| 65 | 65 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 ###################################################################### | 177 ###################################################################### |
| 178 | 178 |
| 179 LLVM_GCC = BASE + '/arm-none-linux-gnueabi/llvm-gcc-4.2/bin/llvm-gcc' | 179 LLVM_GCC = BASE + '/arm-none-linux-gnueabi/llvm-gcc-4.2/bin/llvm-gcc' |
| 180 | 180 |
| 181 LLVM_GXX = BASE + '/arm-none-linux-gnueabi/llvm-gcc-4.2/bin/llvm-g++' | 181 LLVM_GXX = BASE + '/arm-none-linux-gnueabi/llvm-gcc-4.2/bin/llvm-g++' |
| 182 | 182 |
| 183 LLC_ARM = BASE + '/arm-none-linux-gnueabi/llvm/bin/llc' | 183 LLC_ARM = BASE + '/arm-none-linux-gnueabi/llvm/bin/llc' |
| 184 | 184 |
| 185 LLC_SFI_ARM = BASE + '/arm-none-linux-gnueabi/llvm/bin/llc-sfi' | 185 LLC_SFI_ARM = BASE + '/arm-none-linux-gnueabi/llvm/bin/llc-sfi' |
| 186 | 186 |
| 187 # NOTE: patch your own llc in here | 187 # Path to llc executable for x86-32. |
| 188 LLC_SFI_X86 = None | 188 LLC_SFI_X86 = os.getenv('LLC_SFI_X86', None) |
| 189 | 189 |
| 190 LLVM_LINK = BASE + '/arm-none-linux-gnueabi/llvm/bin/llvm-link' | 190 LLVM_LINK = BASE + '/arm-none-linux-gnueabi/llvm/bin/llvm-link' |
| 191 | 191 |
| 192 LLVM_LD = BASE + '/arm-none-linux-gnueabi/llvm/bin/llvm-ld' | 192 LLVM_LD = BASE + '/arm-none-linux-gnueabi/llvm/bin/llvm-ld' |
| 193 | 193 |
| 194 OPT = BASE + '/arm-none-linux-gnueabi/llvm/bin/opt' | 194 OPT = BASE + '/arm-none-linux-gnueabi/llvm/bin/opt' |
| 195 | 195 |
| 196 # NOTE: from code sourcery | 196 # NOTE: from code sourcery |
| 197 AS_ARM = BASE + '/codesourcery/arm-2007q3/arm-none-linux-gnueabi/bin/as' | 197 AS_ARM = BASE + '/codesourcery/arm-2007q3/arm-none-linux-gnueabi/bin/as' |
| 198 | 198 |
| 199 # NOTE: hack, assuming presence of x86/32 toolchain expected | 199 # NOTE: hack, assuming presence of x86/32 toolchain expected |
| 200 # TODO(robertm): clean this up | 200 # TODO(robertm): clean this up |
| 201 AS_X8632 = BASE + '/../linux_x86/sdk/nacl-sdk/bin/nacl64-as' | 201 AS_X8632 = BASE + '/../linux_x86/sdk/nacl-sdk/bin/nacl64-as' |
| 202 | 202 |
| 203 # NOTE: from code sourcery | 203 # NOTE: from code sourcery |
| 204 # TODO(robertm): get rid of the use of gcc here this uses cpp + as | 204 # TODO(robertm): get rid of the use of gcc here this uses cpp + as |
| 205 CCAS_ARM = BASE + '/codesourcery/arm-2007q3/arm-none-linux-gnueabi/bin/gcc' | 205 CCAS_ARM = BASE + '/codesourcery/arm-2007q3/arm-none-linux-gnueabi/bin/gcc' |
| 206 | 206 |
| 207 # NOTE: hack, assuming presence of x86/32 toolchain expected | 207 # NOTE: hack, assuming presence of x86/32 toolchain expected |
| 208 # TODO(robertm): clean this up | 208 # TODO(robertm): clean this up |
| 209 CCAS_X8632 = BASE + '/../linux_x86-32/sdk/nacl-sdk/bin/nacl-gcc' | 209 CCAS_X8632 = BASE + '/../linux_x86-32/sdk/nacl-sdk/bin/nacl-gcc' |
| 210 | 210 |
| 211 LD_ARM = BASE + '/codesourcery/arm-2007q3/arm-none-linux-gnueabi/bin/ld' | 211 LD_ARM = BASE + '/codesourcery/arm-2007q3/arm-none-linux-gnueabi/bin/ld' |
| 212 | 212 |
| 213 # NOTE: hack, assuming presence of x86/32 toolchain expected | 213 # NOTE: hack, assuming presence of x86/32 toolchain expected |
| 214 # TODO(robertm): clean this up - we may not need separate linkers | 214 # TODO(robertm): clean this up - we may not need separate linkers |
| 215 # NOTE(robertm): the nacl linker sometimes creates empty sections like .plt | 215 # NOTE(robertm): the nacl linker sometimes creates empty sections like .plt |
| 216 # so we use the system linker for now | 216 # so we use the system linker for now |
| 217 #LD_X8632 = BASE + '/../linux_x86-32/sdk/nacl-sdk/bin/nacl-ld' | 217 #LD_X8632 = BASE + '/../linux_x86-32/sdk/nacl-sdk/bin/nacl-ld' |
| 218 LD_X8632 = 'ld' | 218 LD_X8632 = '/usr/bin/ld' |
| 219 # NOTE(adonovan): this should _not_ be the Gold linker, e.g. 2.18.*. |
| 220 # Beware, one of the Chrome installation scripts may have changed |
| 221 # /usr/bin/ld (which is evil). |
| 219 | 222 |
| 220 ###################################################################### | 223 ###################################################################### |
| 221 # Code | 224 # Code |
| 222 ###################################################################### | 225 ###################################################################### |
| 223 | 226 |
| 224 def LogInfo(m): | 227 def LogInfo(m): |
| 225 if VERBOSE: | 228 if VERBOSE: |
| 226 print m | 229 print m |
| 227 if OUT: | 230 if OUT: |
| 228 print >> OUT, m | 231 print >> OUT, m |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 LogFatal('Unexpected ld arg: %s' % a) | 552 LogFatal('Unexpected ld arg: %s' % a) |
| 550 | 553 |
| 551 assert output | 554 assert output |
| 552 | 555 |
| 553 # NOTE: LLVM_LD automagically appends .bc to the output | 556 # NOTE: LLVM_LD automagically appends .bc to the output |
| 554 # NOTE: without -disable-internalize only the symbol 'main' | 557 # NOTE: without -disable-internalize only the symbol 'main' |
| 555 # is exported, but we need some more for the startup code | 558 # is exported, but we need some more for the startup code |
| 556 # which kept alive via REACHABLE_FUNCTION_SYMBOLS | 559 # which kept alive via REACHABLE_FUNCTION_SYMBOLS |
| 557 if '-nostdlib' not in argv: | 560 if '-nostdlib' not in argv: |
| 558 if last_bitcode_pos != None: | 561 if last_bitcode_pos != None: |
| 562 # Splice in the extra symbols. |
| 563 # TODO(adonovan): temp hack to avoid "multiple defns" error. |
| 559 args_bit_ld = (args_bit_ld[:last_bitcode_pos] + | 564 args_bit_ld = (args_bit_ld[:last_bitcode_pos] + |
| 560 [REACHABLE_FUNCTION_SYMBOLS] + | 565 # [REACHABLE_FUNCTION_SYMBOLS] + |
| 561 args_bit_ld[last_bitcode_pos:]) | 566 args_bit_ld[last_bitcode_pos:]) |
| 562 | 567 |
| 563 # NOTE: .bc will be appended output by LLVM_LD | 568 # NOTE: .bc will be appended output by LLVM_LD |
| 564 Run([LLVM_LD] + args_bit_ld + ['-disable-internalize', '-o', output]) | 569 Run([LLVM_LD] + args_bit_ld + ['-disable-internalize', '-o', output]) |
| 565 return output, args_native_ld | 570 return output, args_native_ld |
| 566 | 571 |
| 567 | 572 |
| 568 def Incarnation_bcldarm(argv): | 573 def Incarnation_bcldarm(argv): |
| 569 """The ld step for bitcode is quite elaborate: | 574 """The ld step for bitcode is quite elaborate: |
| 570 1) Run llvm-ld to produce a single bitcode file | 575 1) Run llvm-ld to produce a single bitcode file |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 | 621 |
| 617 TODO(robertm): llvm-ld does NOT complain when passed a native .o file. | 622 TODO(robertm): llvm-ld does NOT complain when passed a native .o file. |
| 618 It will discard it silently. | 623 It will discard it silently. |
| 619 """ | 624 """ |
| 620 output, args_native_ld = GenerateCombinedBitcodeFile(argv) | 625 output, args_native_ld = GenerateCombinedBitcodeFile(argv) |
| 621 | 626 |
| 622 bitcode_combined = output + ".bc" | 627 bitcode_combined = output + ".bc" |
| 623 asm_combined = output + ".bc.s" | 628 asm_combined = output + ".bc.s" |
| 624 obj_combined = output + ".bc.o" | 629 obj_combined = output + ".bc.o" |
| 625 | 630 |
| 631 # TODO(adonovan): use external env var until we complete llc SFI for x86. |
| 632 if not LLC_SFI_X86: |
| 633 LogFatal('You must set LLC_SFI_X86 to your llc executable for x86-32.') |
| 634 |
| 626 Run([LLC_SFI_X86] + | 635 Run([LLC_SFI_X86] + |
| 627 LLC_SHARED_FLAGS_X8632 + | 636 LLC_SHARED_FLAGS_X8632 + |
| 628 ['-f', bitcode_combined, '-o', asm_combined]) | 637 ['-f', bitcode_combined, '-o', asm_combined]) |
| 629 | 638 |
| 630 Run([AS_X8632] + AS_FLAGS_X8632 + [asm_combined, '-o', obj_combined]) | 639 Run([AS_X8632] + AS_FLAGS_X8632 + [asm_combined, '-o', obj_combined]) |
| 631 | 640 |
| 632 args_native_ld = MassageFinalLinkCommandX8632([obj_combined] + args_native_ld) | 641 args_native_ld = MassageFinalLinkCommandX8632([obj_combined] + args_native_ld) |
| 633 | 642 |
| 634 Run([LD_X8632] + args_native_ld) | 643 Run([LD_X8632] + args_native_ld) |
| 635 | 644 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 682 if basename not in INCARNATIONS: | 691 if basename not in INCARNATIONS: |
| 683 LogFatal("unknown command: " + StringifyCommand(argv)) | 692 LogFatal("unknown command: " + StringifyCommand(argv)) |
| 684 | 693 |
| 685 | 694 |
| 686 INCARNATIONS[basename](argv) | 695 INCARNATIONS[basename](argv) |
| 687 return 0 | 696 return 0 |
| 688 | 697 |
| 689 | 698 |
| 690 if __name__ == "__main__": | 699 if __name__ == "__main__": |
| 691 sys.exit(main(sys.argv)) | 700 sys.exit(main(sys.argv)) |
| OLD | NEW |