[llvm-commits] LLD: update the WriterELF.cpp to use newly added Atom reference data

Nick Kledzik kledzik at apple.com
Thu Sep 20 12:56:17 PDT 2012


On Sep 20, 2012, at 6:46 AM, Sid Manning wrote:
> Is this change ok to commit?
It is ok.

My only suggestion is to use a struct instead of a tuple for AtomInfo.  Tuples are nice for on-the-fly types, but you are defining a typedef for AtomInfo, so why have named fields?

typedef std::tuple<const DefinedAtom*, uint64_t> AtomInfo;

You current use look like:
  std::get<0>(ai)
whereas a struct would require less mental buffering to understand:
   ai->atom

-Nick


> 
> On 09/18/12 09:14, Sid Manning wrote:
>> This patch makes use of recently added relocation reference data.  The
>> bulk of this is derived from the Mach-O writer.
>> 
>>  * Adds loop to SectionChunk::write traverse references calling the
>> writer's fixup handler, applyFixup.
>>  * Adds method, ELFWriter::buildAtomToAddressMap to that creates a
>> mapping from an atom to its runtime address.
>>  * Adds method, ELFWriter::addressOfAtom to return the runtime address
>> of the atom.
>> 
>> 
>> Thanks,
>> 
>> --
>> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
>> hosted by The Linux Foundation
>> 
>> 
>> WriterELF.diff
>> 
>> 
>> 
>> This patch makes use of recently added relocation reference data.
>> 
>>  * Adds loop to SectionChunk::write traverse references calling the
>>    writer's fixup handler, applyFixup.
>>  * Adds method, ELFWriter::buildAtomToAddressMap to that creates a mapping
>>    from an atom to its runtime address.
>>  * Adds method, ELFWriter::addressOfAtom to return the runtime address of
>>    the atom.
>> 
>> Index: lib/ReaderWriter/ELF/WriterELF.cpp
>> ===================================================================
>> --- lib/ReaderWriter/ELF/WriterELF.cpp	(revision 164027)
>> +++ lib/ReaderWriter/ELF/WriterELF.cpp	(working copy)
>> @@ -425,7 +425,20 @@
>>        continue;
>>      uint8_t *atomContent = chunkBuffer + std::get<1>(ai);
>>      std::copy_n(content.data(), contentSize, atomContent);
>> -    // TODO Apply fixups to file buffer
>> +
>> +    for (const Reference *ref : *std::get<0>(ai)){
>> +      uint32_t offset = ref->offsetInAtom();
>> +      uint64_t targetAddress = 0;
>> +
>> +      if ( ref->target() != nullptr )
>> +         targetAddress = _writer.addressOfAtom(ref->target());
>> +
>> +      uint64_t fixupAddress = _writer.addressOfAtom(std::get<0>(ai)) + offset;
>> +      _writer.kindHandler()->applyFixup(ref->kind(), ref->addend(),
>> +&atomContent[offset],
>> +                                        fixupAddress,
>> +                                        targetAddress);
>> +    }
>>    }
>>  }
>>  //
>> @@ -685,8 +698,9 @@
>>    typedef object::Elf_Shdr_Impl<target_endianness, is64Bits>  Elf_Shdr;
>>    ELFWriter(const WriterOptionsELF&options);
>>    virtual error_code writeFile(const lld::File&File, StringRef path);
>> +  uint64_t addressOfAtom(const Atom *atom);
>>    ArrayRef<Chunk<target_endianness, is64Bits>*>  chunks() { return _chunks; }
>> -  KindHandler *kindHandler() { return _referenceKindHandler; }
>> +  KindHandler *kindHandler() { return _referenceKindHandler.get(); }
>> 
>>    std::vector<SectionChunk<target_endianness, is64Bits>*>  sectionChunks() {
>>      return _sectionChunks ;
>> @@ -699,11 +713,18 @@
>>  private:
>>    void build(const lld::File&file);
>>    void createChunks(const lld::File&file);
>> +  void buildAtomToAddressMap();
>>    void assignFileOffsets();
>>    const WriterOptionsELF&_options;
>> +
>> +/// \brief AtomToAddress: Is a mapping from an Atom to the address where
>> +/// it will live in the output file.
>> +  typedef llvm::DenseMap<const Atom*, uint64_t>  AtomToAddress;
>> +
>>    ELFStringSectionChunk<target_endianness, is64Bits>  *_shstrtable ;
>>    std::unique_ptr<KindHandler>  _referenceKindHandler;
>>    ELFSectionHeaderChunk<target_endianness, is64Bits>  *_sectionHeaderChunk;
>> +  AtomToAddress _atomToAddress;
>>    std::vector<Chunk<target_endianness, is64Bits>*>  _chunks;
>>    const DefinedAtom *_entryAtom;
>>    std::vector<SectionChunk<target_endianness, is64Bits>*>  _sectionChunks;
>> @@ -725,6 +746,7 @@
>>    // Create objects for each chunk.
>>    createChunks(file);
>>    assignFileOffsets();
>> +  buildAtomToAddressMap();
>>  }
>> 
>>  template<support::endianness target_endianness, bool is64Bits>
>> @@ -794,7 +816,21 @@
>>    _chunks.push_back(_shstrtable);
>>  }
>> 
>> +template<support::endianness target_endianness, bool is64Bits>
>> +void ELFWriter<target_endianness, is64Bits>
>> +              ::buildAtomToAddressMap () {
>> 
>> +// _atomToAddress is a DenseMap that maps an atom its file address.
>> +// std::get<1>(ai) is the offset from the start of the section to the atom.
>> +  for (auto&chunk : _sectionChunks){
>> +    for (auto&ai : chunk->atoms() ) {
>> +      _atomToAddress[std::get<0>(ai)] = chunk->address() + std::get<1>(ai);
>> +    }
>> +  }
>> +
>> +
>> +}
>> +
>>  template<support::endianness target_endianness, bool is64Bits>
>>  void ELFWriter<target_endianness, is64Bits>::assignFileOffsets() {
>>    DEBUG_WITH_TYPE("WriterELF-layout", dbgs()
>> @@ -844,6 +880,11 @@
>>    return buffer->commit();
>>  }
>> 
>> +template<support::endianness target_endianness, bool is64Bits>
>> +uint64_t ELFWriter<target_endianness, is64Bits>
>> +                    ::addressOfAtom(const Atom *atom) {
>> +  return _atomToAddress[atom];
>> +}
>>  } // namespace elf
>> 
>>  Writer *createWriterELF(const WriterOptionsELF&options) {
> 
> 
> -- 
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation




More information about the llvm-commits mailing list