Skip to content
  1. Dec 17, 2016
  2. Dec 01, 2016
    • Sean Silva's avatar
      Add `isRelExprOneOf` helper · 2eed7592
      Sean Silva authored
      In various places in LLD's hot loops, we have expressions of the form
      "E == R_FOO || E == R_BAR || ..." (E is a RelExpr).
      
      Some of these expressions are quite long, and even though they usually go just
      a very small number of ways and so should be well predicted, they can still
      occupy branch predictor resources harming other parts of the code, or they
      won't be predicted well if they overflow branch predictor resources or if the
      branches are too dense and the branch predictor can't track them all (the
      compiler can in theory avoid this, at a cost in text size). And some of these
      expressions are so large and executed so frequently that even when
      well-predicted they probably still have a nontrivial cost.
      
      This speedup should be pretty portable. The cost of these simple bit tests is
      independent of:
      
      - the target we are linking for
      - the distribution of RelExpr's for a given link (which can depend on how the
        input files were compiled)
      - what compiler was used to compile LLD (it is just a simple bit test;
        hopefully the compiler gets it right!)
      - adding new target-dependent relocations (e.g. needsPlt doesn't pay any extra
        cost checking R_PPC_PLT_OPD on x86-64 builds)
      
      I did some rough measurements on clang-fsds and this patch gives over about 4%
      speedup for a regular -O1 link, about 2.5% for -O3 --gc-sections and over 5%
      for -O0. Sorry, I don't have my current machine set up for doing really
      accurate measurements right now.
      
      This also is just a bit cleaner. Thanks for Joerg for suggesting for
      this approach.
      
      Differential Revision: https://reviews.llvm.org/D27156
      
      llvm-svn: 288314
      2eed7592
  3. Nov 25, 2016
  4. Nov 16, 2016
    • Simon Atanasyan's avatar
      [ELF][MIPS] Add MipsGotSection to handle MIPS GOT · 725dc14b
      Simon Atanasyan authored
      MIPS GOT handling is very different from other targets so it is better
      to keep the code in the separatre section class MipsGotSection. This
      patch introduces the new section and moves all MIPS specific code from
      GotSection to the new class. I did not rename fields and methods in the
      MipsGotSection class to reduce the diff and plan to do that by the
      separate commit.
      
      Differential revision: https://reviews.llvm.org/D26733
      
      llvm-svn: 287150
      725dc14b
  5. Nov 10, 2016
    • Rafael Espindola's avatar
      Parse relocations only once. · 9f0c4bb7
      Rafael Espindola authored
      Relocations are the last thing that we wore storing a raw section
      pointer to and parsing on demand.
      
      With this patch we parse it only once and store a pointer to the
      actual data.
      
      The patch also changes where we store it. It is now in
      InputSectionBase. Not all sections have relocations, but most do and
      this simplifies the logic. It also means that we now only support one
      relocation section per section. Given that that constraint is
      maintained even with -r with gold bfd and lld, I think it is OK.
      
      llvm-svn: 286459
      9f0c4bb7
  6. Nov 08, 2016
  7. Oct 21, 2016
    • Simon Atanasyan's avatar
      [ELF][MIPS] Put local GOT entries accessed via a 16-bit index first · bed04bf1
      Simon Atanasyan authored
      Some MIPS relocations used to access GOT entries are able to manipulate
      16-bit index. The other ones like R_MIPS_CALL_HI16/LO16 can handle
      32-bit indexes. 16-bit relocations are generated by default. The 32-bit
      relocations are generated by -mxgot flag passed to compiler. Usually
      these relocation are not mixed in the same code but files like crt*.o
      contain 16-bit relocations so even if all "user's" code compiled with
      -mxgot flag a few 16-bit relocations might come to the linking phase.
      
      Now LLD does not differentiate local GOT entries accessed via a 16-bit
      and 32-bit indexes. That might lead to relocation's overflow if 16-bit
      entries are allocated to far from the beginning of the GOT.
      
      The patch introduces new "part" of MIPS GOT dedicated to the local GOT
      entries accessed by 32-bit relocations. That allows to put local GOT
      entries accessed via a 16-bit index first and escape relocation's overflow.
      
      Differential revision: https://reviews.llvm.org/D25833
      
      llvm-svn: 284809
      bed04bf1
    • Rui Ueyama's avatar
      Add comments. · 865d9865
      Rui Ueyama authored
      llvm-svn: 284805
      865d9865
  8. Oct 20, 2016
    • Peter Smith's avatar
      [ELF] Allow relative exceptions relocations in shared libraries · d6486034
      Peter Smith authored
          
      The R_ARM_PREL31 and R_ARM_NONE relocations should not be faulted in
      shared libraries. In the case of R_ARM_NONE, we have moved the TLS
      relaxation hint instruction to R_TLSDESC_CALL so that R_HINT can be used
      without side-effects. In the case of R_ARM_PREL31 we permit it to be used
      against PLT entries as the personality routines are imported when used in
      shared libraries.
      
      Differential Revision: https://reviews.llvm.org/D25721
      
      llvm-svn: 284710
      d6486034
  9. Sep 07, 2016
  10. Sep 01, 2016
  11. Jul 20, 2016
    • Rafael Espindola's avatar
      Create thunks before regular relocation scan. · 0f7cedaa
      Rafael Espindola authored
      We will need to do something like this to support range extension
      thunks since that process is iterative.
      
      Doing this also has the advantage that when doing the regular
      relocation scan the offset in the output section is known and we can
      just store that. This reduces the number of times we have to run
      getOffset and I think will allow a more specialized .eh_frame
      representation.
      
      By itself this is already a performance win.
      
      firefox
        master 7.295045737
        patch  7.209466989 0.98826892235
      chromium
        master 4.531254468
        patch  4.509221804 0.995137623774
      chromium fast
        master 1.836928973
        patch  1.823805241 0.992855612714
      the gold plugin
        master 0.379768791
        patch  0.380043405 1.00072310839
      clang
        master 0.642698284
        patch  0.642215663 0.999249070657
      llvm-as
        master 0.036665467
        patch  0.036456225 0.994293213284
      the gold plugin fsds
        master 0.40395817
        patch  0.404384555 1.0010555177
      clang fsds
        master 0.722045545
        patch  0.720946135 0.998477367518
      llvm-as fsds
        master 0.03292646
        patch  0.032759965 0.994943428477
      scylla
        master 3.427376378
        patch  3.368316181 0.98276810292
      
      llvm-svn: 276146
      0f7cedaa
  12. Jul 08, 2016
    • Peter Smith's avatar
      Recommit R274836 Add Thunk support framework for ARM and Mips · fb05cd99
      Peter Smith authored
      The TinyPtrVector of const Thunk<ELFT>* in InputSections.h can cause 
      build failures on certain compiler/library combinations when Thunk<ELFT> 
      is not a complete type or is an abstract class. Fixed by making Thunk<ELFT>
      non Abstract.
      
      type or is an abstract class 
      
      llvm-svn: 274863
      fb05cd99
    • Peter Smith's avatar
      Revert R274836 Add Thunk support framework for ARM and Mips · eeb82744
      Peter Smith authored
      This seems to be causing a buildbot failure on lld-x86_64-freebsd. Will
      reproduce locally and fix. 
      
      llvm-svn: 274841
      eeb82744
    • Peter Smith's avatar
      Add Thunk support framework for ARM and Mips · de01b98a
      Peter Smith authored
          
          Generalise the Mips LA25 Thunk code and implement ARM and Thumb
          interworking Thunks.
          
          - Introduce a new module Thunks.cpp to store the Target Specific Thunk
            implementations.
          - DefinedRegular and Shared have a ThunkData field to record Thunk.
          - A Target can have more than one type of Thunk.
          - Support PC-relative calls to Thunks.
          - Support Thunks to PLT entries.
          - Existing Mips LA25 Thunk code integrated.
          - Support for ARMv7A interworking Thunks.
          
          Limitations:
          - Only one Thunk per SymbolBody, this is sufficient for all currently
            implemented Thunks.
          - ARM thunks assume presence of V6T2 MOVT and MOVW instructions.
      
          Differential revision: http://reviews.llvm.org/D21891
      
      llvm-svn: 274836
      de01b98a
  13. Jul 02, 2016
  14. Jun 23, 2016
    • Simon Atanasyan's avatar
      [ELF][MIPS] Support MIPS TLS relocations · 002e2447
      Simon Atanasyan authored
      The patch adds one more partition to the MIPS GOT. This time it is for
      TLS related GOT entries. Such entries are located after 'local' and 'global'
      ones. We cannot get a final offset for these entries at the time of
      creation because we do not know size of 'local' and 'global' partitions.
      So we have to adjust the offset later using `getMipsTlsOffset()` method.
      
      All MIPS TLS relocations which need GOT entries operates MIPS style GOT
      offset - 'offset from the GOT's beginning' - MipsGPOffset constant. That
      is why I add new types of relocation expressions.
      
      One more difference from othe ABIs is that the MIPS ABI does not support
      any TLS relocation relaxations. I decided to make a separate function
      `handleMipsTlsRelocation` and put MIPS TLS relocation handling code
      there. It is similar to `handleTlsRelocation` routine and duplicates its
      code. But it allows to make the code cleaner and prevent pollution of
      the `handleTlsRelocation` by MIPS 'if' statements.
      
      Differential Revision: http://reviews.llvm.org/D21606
      
      llvm-svn: 273569
      002e2447
    • Rui Ueyama's avatar
      Fix a bug that MIPS thunks can overwrite other section contents. · 809d8e2d
      Rui Ueyama authored
      Peter Smith found while trying to support thunk creation for ARM that
      LLD sometimes creates broken thunks for MIPS. The cause of the bug is
      that we assign file offsets to input sections too early. We need to
      create all sections and then assign section offsets because appending
      thunks changes file offsets for all following sections.
      
      This patch separates the pass to assign file offsets from thunk
      creation pass. This effectively reverts r265673.
      
      Differential Revision: http://reviews.llvm.org/D21598
      
      llvm-svn: 273532
      809d8e2d
  15. Jun 19, 2016
    • Simon Atanasyan's avatar
      [ELF][MIPS] Support GOT entries for non-preemptible symbols with different addends · 4132511c
      Simon Atanasyan authored
      There are two motivations for this patch. The first one is a preparation
      for support MIPS TLS relocations. It might sound like a joke but for GOT
      entries related to TLS relocations MIPS ABI uses almost regular approach
      with creation of dynamic relocations for each GOT enty etc. But we need
      to separate these 'regular' TLS related entries from MIPS specific local
      and global parts of GOT. ABI declare simple solution - all TLS related
      entries allocated at the end of GOT after local/global parts. The second
      motivation it to support GOT relocations for non-preemptible symbols
      with addends. If we have more than one GOT relocations against symbol S
      with different addends we need to create GOT entries for each unique
      Symbol/Addend pairs.
      
      So we store all MIPS GOT entries in separate containers. For non-preemptible
      symbols we have to maintain two data structures. The first one is MipsLocal
      vector. Each entry corresponds to the GOT entry from the 'local' part
      of the GOT contains the symbol's address plus addend. The second one
      is MipsLocalMap. It is a map from Symbol/Addend pair to the GOT index.
      
      Differential Revision: http://reviews.llvm.org/D21297
      
      llvm-svn: 273127
      4132511c
  16. Jun 05, 2016
  17. Jun 04, 2016
  18. Jun 02, 2016
    • Rafael Espindola's avatar
      Start adding tlsdesc support for aarch64. · e37d13b9
      Rafael Espindola authored
      This is mostly extracted from http://reviews.llvm.org/D18960.
      
      The general idea for tlsdesc is that the two GD got entries are used
      for a function pointer and its argument. The dynamic linker sets
      both. In the non-dlopen case the dynamic linker sets the function to
      the identity and the argument to the offset in the tls block.
      
      All that the static linker has to do in the non-dlopen case is
      relocate the code to point to the got entries and create a dynamic
      relocation.
      
      The dlopen case is more complicated, but can be implemented in another patch.
      
      llvm-svn: 271569
      e37d13b9
  19. Jun 01, 2016
  20. May 25, 2016
  21. May 24, 2016
Loading