OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. | 2 # Copyright (c) 2012 The Native Client Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 from driver_tools import ArchMerge, DriverChain, GetArch, \ | 6 from driver_tools import ArchMerge, DriverChain, GetArch, \ |
7 ParseArgs, ParseTriple, RunDriver, RunWithEnv, SetArch, \ | 7 ParseArgs, ParseTriple, RunDriver, RunWithEnv, SetArch, \ |
8 SetExecutableMode, TempNameGen, UnrecognizedOption | 8 SetExecutableMode, TempNameGen, UnrecognizedOption |
9 from driver_env import env | 9 from driver_env import env |
10 from driver_log import Log | 10 from driver_log import Log |
11 import filetype | 11 import filetype |
12 import ldtools | 12 import ldtools |
| 13 import os |
13 import pathtools | 14 import pathtools |
14 | 15 |
15 EXTRA_ENV = { | 16 EXTRA_ENV = { |
16 'ALLOW_NATIVE': '0', # Allow LD args which will change the behavior | 17 'ALLOW_NATIVE': '0', # Allow LD args which will change the behavior |
17 # of native linking. This must be accompanied by | 18 # of native linking. This must be accompanied by |
18 # -arch to produce a .nexe. | 19 # -arch to produce a .nexe. |
19 'USE_IRT': '1', # Use stable IRT interfaces. | 20 'USE_IRT': '1', # Use stable IRT interfaces. |
20 | 21 |
21 'INPUTS' : '', | 22 'INPUTS' : '', |
22 'OUTPUT' : '', | 23 'OUTPUT' : '', |
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 inputs = ldtools.ExpandInputs(inputs, | 339 inputs = ldtools.ExpandInputs(inputs, |
339 env.get('SEARCH_DIRS'), | 340 env.get('SEARCH_DIRS'), |
340 env.getbool('STATIC'), | 341 env.getbool('STATIC'), |
341 # Once all glibc bitcode link is purely | 342 # Once all glibc bitcode link is purely |
342 # bitcode (e.g., even libc_nonshared.a) | 343 # bitcode (e.g., even libc_nonshared.a) |
343 # we may be able to restrict this more. | 344 # we may be able to restrict this more. |
344 # This is also currently used by | 345 # This is also currently used by |
345 # pnacl_generate_pexe=0 with glibc, | 346 # pnacl_generate_pexe=0 with glibc, |
346 # for user libraries. | 347 # for user libraries. |
347 ldtools.LibraryTypes.ANY) | 348 ldtools.LibraryTypes.ANY) |
| 349 plls, inputs = FilterPlls(inputs) |
| 350 plls = [os.path.basename(pll) for pll in plls] |
| 351 |
| 352 if not env.getbool('SHARED') and plls != []: |
| 353 Log.Fatal('Passing a PLL to the linker requires the "-shared" option.') |
348 | 354 |
349 # Make sure the inputs have matching arch. | 355 # Make sure the inputs have matching arch. |
350 CheckInputsArch(inputs) | 356 CheckInputsArch(inputs) |
351 | 357 |
352 regular_inputs, native_objects = SplitLinkLine(inputs) | 358 regular_inputs, native_objects = SplitLinkLine(inputs) |
353 | 359 |
354 if env.getbool('RELOCATABLE'): | 360 if env.getbool('RELOCATABLE'): |
355 bitcode_type = 'po' | 361 bitcode_type = 'po' |
356 native_type = 'o' | 362 native_type = 'o' |
357 else: | 363 else: |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 pre_simplify_shared = [ | 403 pre_simplify_shared = [ |
398 # The following is a subset of "-pnacl-abi-simplify-preopt". We don't | 404 # The following is a subset of "-pnacl-abi-simplify-preopt". We don't |
399 # want to run the full "-pnacl-abi-simplify-preopt" because it | 405 # want to run the full "-pnacl-abi-simplify-preopt" because it |
400 # internalizes symbols that we want to export via "-convert-to-pso". | 406 # internalizes symbols that we want to export via "-convert-to-pso". |
401 '-nacl-global-cleanup', | 407 '-nacl-global-cleanup', |
402 '-expand-varargs', | 408 '-expand-varargs', |
403 '-rewrite-pnacl-library-calls', | 409 '-rewrite-pnacl-library-calls', |
404 '-rewrite-llvm-intrinsic-calls', | 410 '-rewrite-llvm-intrinsic-calls', |
405 '-convert-to-pso', | 411 '-convert-to-pso', |
406 ] | 412 ] |
| 413 # ConvertToPso takes a list of comma-separated PLL dependencies as an |
| 414 # argument. |
| 415 if plls != []: |
| 416 pre_simplify_shared += ['-convert-to-pso-deps=' + ','.join(plls)] |
407 opt_args.append(pre_simplify_shared) | 417 opt_args.append(pre_simplify_shared) |
408 # Post-opt is required, since '-convert-to-pso' adds metadata which must | 418 # Post-opt is required, since '-convert-to-pso' adds metadata which must |
409 # be simplified before finalization. Additionally, all functions must be | 419 # be simplified before finalization. Additionally, all functions must be |
410 # simplified in the post-opt passes. | 420 # simplified in the post-opt passes. |
411 abi_simplify = True | 421 abi_simplify = True |
412 elif abi_simplify: | 422 elif abi_simplify: |
413 pre_simplify = ['-pnacl-abi-simplify-preopt'] | 423 pre_simplify = ['-pnacl-abi-simplify-preopt'] |
414 if env.getone('CXX_EH_MODE') == 'sjlj': | 424 if env.getone('CXX_EH_MODE') == 'sjlj': |
415 pre_simplify += ['-enable-pnacl-sjlj-eh'] | 425 pre_simplify += ['-enable-pnacl-sjlj-eh'] |
416 else: | 426 else: |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 result_libs = [] | 514 result_libs = [] |
505 for user_lib in user_libs: | 515 for user_lib in user_libs: |
506 if user_lib in public_libs: | 516 if user_lib in public_libs: |
507 result_libs.append(private_lib_for(user_lib)) | 517 result_libs.append(private_lib_for(user_lib)) |
508 if can_coexist(user_lib): | 518 if can_coexist(user_lib): |
509 result_libs.append(user_lib) | 519 result_libs.append(user_lib) |
510 else: | 520 else: |
511 result_libs.append(user_lib) | 521 result_libs.append(user_lib) |
512 return result_libs | 522 return result_libs |
513 | 523 |
| 524 def FilterPlls(inputs): |
| 525 """ Split the input list into PLLs and other objects. |
| 526 """ |
| 527 plls = [] |
| 528 other = [] |
| 529 |
| 530 for f in inputs: |
| 531 if ldtools.IsFlag(f) or not filetype.IsPll(f): |
| 532 other.append(f) |
| 533 else: |
| 534 plls.append(f) |
| 535 return (plls, other) |
| 536 |
514 def SplitLinkLine(inputs): | 537 def SplitLinkLine(inputs): |
515 """ Split the input list into bitcode and native objects (.o, .a) | 538 """ Split the input list into bitcode and native objects (.o, .a) |
516 """ | 539 """ |
517 normal = [] | 540 normal = [] |
518 native = [] | 541 native = [] |
519 # Group flags need special handling because they need to go into the right | 542 # Group flags need special handling because they need to go into the right |
520 # list based on the type of the inputs in the group. If the group has both | 543 # list based on the type of the inputs in the group. If the group has both |
521 # native and bitcode files (which is unfortunately the case for | 544 # native and bitcode files (which is unfortunately the case for |
522 # irt_browser_lib) then the group flags need to go in both lists. | 545 # irt_browser_lib) then the group flags need to go in both lists. |
523 if '--start-group' in inputs: | 546 if '--start-group' in inputs: |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 -O<opt-level> Optimize output file | 647 -O<opt-level> Optimize output file |
625 -M, --print-map Print map file on standard output | 648 -M, --print-map Print map file on standard output |
626 --whole-archive Include all objects from following archives | 649 --whole-archive Include all objects from following archives |
627 --no-whole-archive Turn off --whole-archive | 650 --no-whole-archive Turn off --whole-archive |
628 -s, --strip-all Strip all symbols | 651 -s, --strip-all Strip all symbols |
629 -S, --strip-debug Strip debugging symbols | 652 -S, --strip-debug Strip debugging symbols |
630 -u SYM, --undefined=SYM Start with undefined reference to SYM | 653 -u SYM, --undefined=SYM Start with undefined reference to SYM |
631 | 654 |
632 -help | -h Output this help. | 655 -help | -h Output this help. |
633 """ | 656 """ |
OLD | NEW |