1. 22 Jan, 2015 2 commits
  2. 20 Jan, 2015 3 commits
    • Subzero: Remove the GlobalContext::GlobalDeclarations vector. · a086b913
      Jim Stichnoth authored
      Elements were added to this vector, but never inspected, so it is
      essentially a useless field.  Plus, the removal allows us to remove a
      couple of friend declarations.
      
      BUG=none
      R=kschimpf@google.com
      
      Review URL: https://codereview.chromium.org/814163004
    • Subzero: Add locking to prepare for multithreaded translation. · e4a8f400
      Jim Stichnoth authored
      This just gets the locking in place.  Actual multithreading will be added later.
      
      Mutexes are added for accessing the GlobalContext allocator, the constant pool, the stats data, and the profiling timers.  These are managed via the LockedPtr<> helper.  Finer grain locks on the constant pool may be added later, i.e. a separate lock for each data type.
      
      An vector of pointers to TLS objects is added to GlobalContext.  Each new thread will get its own TLS object, whose address is added to the vector.  (After threads complete, things like stats can be combined by iterating over the vector.)
      
      The dump/emit streams are guarded by a separate lock, to avoid fine-grain interleaving of output by multiple threads.  E.g., lock the streams, emit an entire function, and unlock the streams.  This works for dumping too, though dump output for different passes on the same function may be interleaved with that of another thread.  There is an OstreamLocker helper class to keep this simple.
      
      CodeStats is made an inner class of GlobalContext (this was missed on a previous CL).
      
      BUG= none
      R=jfb@chromium.org, jvoung@chromium.org, kschimpf@google.com
      
      Review URL: https://codereview.chromium.org/848193003
    • Add instruction alignment tests to unit tests. · af238b25
      Karl Schimpf authored
      BUG=None
      R=jvoung@chromium.org, stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/848473002
  3. 15 Jan, 2015 1 commit
    • Subzero: Remove the IceV_RegManager enum value. · 769be681
      Jim Stichnoth authored
      This hasn't been used in a very long time, and there's no intention of using it again.
      
      Originally there was the idea of a "fast" block-local register allocator for an O1-like configuration, which would allocate registers for infinite-weight temporaries during target lowering, using a "local register manager".  This verbose option was for tracing execution of this register manager.  However, by now it seems unlikely that this would do a better/faster job than the current Om1 register allocation approach, which reuses the linear-scan code quite effectively and does very well at separation of concerns.  So adios IceV_RegManager!
      
      BUG= none
      R=jvoung@chromium.org
      
      Review URL: https://codereview.chromium.org/831663008
  4. 13 Jan, 2015 1 commit
    • Start writing out some relocation sections (text). · ec270731
      Jan Voung authored
      Pass the full assembler pointer to the elf writer, so
      that it has access to both the text buffer and the fixups.
      
      Remove some child classes of AssemblerFixups. They didn't
      really do much, and were pretty much identical to the
      original AssemblerFixup class. Dart had a virtual method
      for fixups to do necessary patching, but we currently
      don't do the patching and just emit the relocations.
      TODO see if patching is more efficient than writing out
      relocations and letting the linker do the work.
      
      This CL also makes AssemblerFixups POD.
      
      Change the fixup kind to be a plain unsigned int, which
      the target can fill w/ target/container-specific values.
      
      Move the fwd declaration of Assembler to IceDefs and remove
      the others. Do similar for fwd declaration refactoring for
      ELFWriter.
      
      Make the createAssembler method return a std::unique_ptr.
      
      BUG=none
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/828873002
  5. 12 Jan, 2015 2 commits
  6. 09 Jan, 2015 6 commits
  7. 23 Dec, 2014 1 commit
  8. 20 Dec, 2014 1 commit
  9. 19 Dec, 2014 2 commits
    • Subzero: Use CFG-local arena allocation for relevant containers. · 31c95590
      Jim Stichnoth authored
      In particular, node lists for in and out edges of a CfgNode, and the live range segment list in a Variable.  This is done by making the Cfg allocator globally available through TLS, and providing the STL containers with an allocator struct that uses this.
      
      This also cleans up some other allocation-related issues:
      
      * The allocator is now hung off the Cfg via a pointer, rather than being embedded into the Cfg.  This allows a const Cfg pointer to be stored in TLS while still allowing its allocator to be mutated.
      
      * Cfg is now created via a static create() method.
      
      * The redundant Cfg::allocateInst<> methods are removed.
      
      * The Variable::asType() method allocates a whole new Variable from the Cfg arena, rather than allocating it on the stack, removing the need for the move constructor in Variable and Operand.  This is OK since asType() is only used for textual asm emission.
      
      * The same 1MB arena allocator is now used by the assembler as well.  The fact that it wasn't changed over to be the same as Cfg and GlobalContext was an oversight.  (It turns out this adds ~3MB to the translator memory footprint, so that could be tuned later.)
      
      BUG= none
      R=jfb@chromium.org, jvoung@chromium.org
      
      Review URL: https://codereview.chromium.org/802183004
    • Subzero: Randomize register assignment. · e6d24789
      Jim Stichnoth authored
      Randomize the order that registers appear in the free list.  Only
      randomize fully "equivalent" registers to ensure no extra spills.
      
      This adds the -randomize-regalloc option.
      
      This is a continuation of https://codereview.chromium.org/456033003/ which Matt owns.
      
      BUG= none
      R=jfb@chromium.org
      
      Review URL: https://codereview.chromium.org/807293003
  10. 15 Dec, 2014 4 commits
    • Remove TypeConverter and Module from minimal subzero build. · 4019f084
      Karl Schimpf authored
      Removes the need to model LLVM types from the minimal subzero build.
      It isn't removed from the nonminimal build because IceConverter still needs
      to be able to convert LLVM types to corresponding Ice types.
      
      Note that this CL reduces the size of Release+Min/llvm2ice (after
      strip) to about 638K bytes.
      
      BUG=None
      R=jvoung@chromium.org, stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/805943002
    • Remove using LLVM tools to check correctness of cast operation. · bf170370
      Karl Schimpf authored
      Removes cast instruction checks (in PNaClTranslator.cpp) that used
      LLVM utilities to use locally defined methods instead. Remove the need
      to call naclbitc::DecodeCastOpcode and CastInst::castIsValid.
      
      Also removes two more calls to convertToLLVMType.
      
      BUG= None
      R=jvoung@chromium.org, stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/794823002
    • Subzero: Clean up live range construction. · e5b73e6e
      Jim Stichnoth authored
      Moves the deletion of newly dead instructions into the main liveness() routine.  The old livenessPostProcess() routine is renamed and now used purely for live range construction.
      
      The hack is removed in which live in-args have a custom live range segment added to avoid an artifact of the live ranges.  It is replaced with a gentler hack that extends the instruction numbering range of the initial basic block to avoid the artifact.
      
      Since special live range segments no longer need to be prepended, the live range representation is simplified and we can always assume that segments are being appended, never prepended (and as before, never added to the middle).
      
      Some magic constants involving special instruction numbers are replaced with symbolic constants.
      
      BUG= none
      R=jvoung@chromium.org
      
      Review URL: https://codereview.chromium.org/802003003
    • Simplify LLVM's APInt and APFloat for use in Subzero. · 3281748c
      Karl Schimpf authored
      In Subzero, we only need to be able to convert 64 bit constants in
      bitcode files to the corresponding Ice integer or floating type. This
      CL extracts the minimal implementation needed for Subzero. The intent
      of this change is to remove loading unnecessary LLVM code into
      (minimal) llvm2ice.
      
      BUG=None
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/797323002
  11. 11 Dec, 2014 3 commits
  12. 10 Dec, 2014 2 commits
  13. 09 Dec, 2014 1 commit
  14. 08 Dec, 2014 1 commit
    • Subzero: Disable stats and timers under the MINIMAL build. · 1c44d819
      Jim Stichnoth authored
      Specifically, don't bother to collect "-timing" and "-szstats" information since they anyway don't get printed out under the MINIMAL build.  This is done by using the ALLOW_DUMP flag to guard whether code and timing stats are collected.  This ends up reducing the native translator size by about 3%.  ALLOW_DUMP is used as the guard since it already guards the output of the collected data - no sense collecting the data if it can never be printed out.
      
      To minimize the number of ALLOW_DUMP tests, we push the tests into the timing/stats class methods.
      
      BUG= none
      R=jvoung@chromium.org, kschimpf@google.com
      
      Review URL: https://codereview.chromium.org/788713002
  15. 07 Dec, 2014 1 commit
  16. 06 Dec, 2014 1 commit
  17. 05 Dec, 2014 1 commit
  18. 04 Dec, 2014 4 commits
  19. 03 Dec, 2014 2 commits
  20. 02 Dec, 2014 1 commit
    • Subzero: Add basic ELFObjectWriter (text section, symtab, strtab, headers). · 08c3bcd6
      Jan Voung authored
      Able to write out the ELF file header w/ a text section,
      a symbol table, and string table. Write text buffer
      directly to file after translating each CFG.
      This means that the header is written out early w/ fake
      data and then we seek back and write the real header
      at the very end.
      
      Does not yet handle relocations, data, rodata, constant
      pools, bss, or -ffunction-sections, more than 64K sections
      or more than 2^24 symbols.
      
      Numbers w/ current NOASSERT=1 build on 176.gcc:
      
      w/out -elf-writer:
          0.233771 (21.1%): [ 1287] emit
          28MB .s file
      
      w/ -elf-writer:
          0.051056 ( 5.6%): [ 1287] emit
          2.4MB .o file
      
      BUG=none
      R=stichnot@chromium.org
      
      Review URL: https://codereview.chromium.org/678533005