[lld] r234953 - temporary

Rui Ueyama ruiu at google.com
Tue Apr 14 16:18:38 PDT 2015


Hmm, I failed to squash local temporary commits before committing. I'm
really sorry. I'll check for it twice next time.

On Tue, Apr 14, 2015 at 4:11 PM, Rui Ueyama <ruiu at google.com> wrote:

> Author: ruiu
> Date: Tue Apr 14 18:11:10 2015
> New Revision: 234953
>
> URL: http://llvm.org/viewvc/llvm-project?rev=234953&view=rev
> Log:
> temporary
>
> Modified:
>     lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.cpp
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.cpp?rev=234953&r1=234952&r2=234953&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/SegmentChunks.cpp Tue Apr 14 18:11:10
> 2015
> @@ -182,7 +182,6 @@ template <class ELFT> void Segment<ELFT>
>
>    startSectionIter = _sections.begin();
>    startSection = 0;
> -  bool isFirstSection = true;
>    bool isDataPageAlignedForNMagic = false;
>    uint64_t startAddr = addr;
>    SegmentSlice<ELFT> *slice = nullptr;
> @@ -190,144 +189,147 @@ template <class ELFT> void Segment<ELFT>
>    bool alignSegments = this->_ctx.alignSegments();
>    StringRef prevOutputSectionName = StringRef();
>
> -  for (auto si = _sections.begin(); si != _sections.end(); ++si) {
> -    // If this is first section in the segment, page align the section
> start
> -    // address. The linker needs to align the data section to a page
> boundary
> -    // only if NMAGIC is set.
> -    if (isFirstSection) {
> -      isFirstSection = false;
> -      if (alignSegments &&
> -          _outputMagic != ELFLinkingContext::OutputMagic::NMAGIC &&
> -          _outputMagic != ELFLinkingContext::OutputMagic::OMAGIC)
> -        // Align to a page only if the output is not
> -        // OutputMagic::NMAGIC/OutputMagic::OMAGIC
> -        startAddr =
> -            llvm::RoundUpToAlignment(startAddr, this->_ctx.getPageSize());
> -      else if (!isDataPageAlignedForNMagic && needAlign(*si)) {
> -        // If the linker outputmagic is set to OutputMagic::NMAGIC, align
> the
> -        // Data to a page boundary.
> -        startAddr =
> -            llvm::RoundUpToAlignment(startAddr, this->_ctx.getPageSize());
> -        isDataPageAlignedForNMagic = true;
> +  // If this is first section in the segment, page align the section start
> +  // address. The linker needs to align the data section to a page
> boundary
> +  // only if NMAGIC is set.
> +  auto si = _sections.begin();
> +  if (si != _sections.end()) {
> +    if (alignSegments &&
> +        _outputMagic != ELFLinkingContext::OutputMagic::NMAGIC &&
> +        _outputMagic != ELFLinkingContext::OutputMagic::OMAGIC) {
> +      // Align to a page only if the output is not
> +      // OutputMagic::NMAGIC/OutputMagic::OMAGIC
> +      startAddr =
> +        llvm::RoundUpToAlignment(startAddr, this->_ctx.getPageSize());
> +    } else if (!isDataPageAlignedForNMagic && needAlign(*si)) {
> +      // If the linker outputmagic is set to OutputMagic::NMAGIC, align
> the
> +      // Data to a page boundary.
> +      startAddr =
> +        llvm::RoundUpToAlignment(startAddr, this->_ctx.getPageSize());
> +      isDataPageAlignedForNMagic = true;
> +    }
> +    // align the startOffset to the section alignment
> +    uint64_t newAddr =
> +      llvm::RoundUpToAlignment(startAddr, (*si)->alignment());
> +    // Handle linker script expressions, which *may update newAddr* if the
> +    // expression assigns to "."
> +    if (auto expr = dyn_cast<ExpressionChunk<ELFT>>(*si))
> +      expr->evalExpr(newAddr);
> +    curSliceAddress = newAddr;
> +    sliceAlign = (*si)->alignment();
> +    (*si)->setVirtualAddr(curSliceAddress);
> +
> +    // Handle TLS.
> +    if (auto section = dyn_cast<Section<ELFT>>(*si)) {
> +      if (section->getSegmentType() == llvm::ELF::PT_TLS) {
> +        tlsStartAddr =
> +          llvm::RoundUpToAlignment(tlsStartAddr, (*si)->alignment());
> +        section->assignVirtualAddress(tlsStartAddr);
> +        tlsStartAddr += (*si)->memSize();
> +      } else {
> +        section->assignVirtualAddress(newAddr);
> +      }
> +    }
> +    // TBSS section is special in that it doesn't contribute to memory of
> any
> +    // segment. If we see a tbss section, don't add memory size to addr
> The
> +    // fileOffset is automatically taken care of since TBSS section does
> not
> +    // end up using file size
> +    if ((*si)->order() != TargetLayout<ELFT>::ORDER_TBSS)
> +      curSliceSize = (*si)->memSize();
> +    ++currSection;
> +    ++si;
> +  }
> +
> +  for (auto e = _sections.end(); si != e; ++si) {
> +    uint64_t curAddr = curSliceAddress + curSliceSize;
> +    if (!isDataPageAlignedForNMagic && needAlign(*si)) {
> +      // If the linker outputmagic is set to OutputMagic::NMAGIC, align
> the
> +      // Data
> +      // to a page boundary
> +      curAddr = llvm::RoundUpToAlignment(curAddr,
> this->_ctx.getPageSize());
> +      isDataPageAlignedForNMagic = true;
> +    }
> +    uint64_t newAddr = llvm::RoundUpToAlignment(curAddr,
> (*si)->alignment());
> +    // Handle linker script expressions, which *may update newAddr* if the
> +    // expression assigns to "."
> +    if (auto expr = dyn_cast<ExpressionChunk<ELFT>>(*si))
> +      expr->evalExpr(newAddr);
> +    Section<ELFT> *sec = dyn_cast<Section<ELFT>>(*si);
> +    StringRef curOutputSectionName;
> +    if (sec) {
> +      curOutputSectionName = sec->outputSectionName();
> +    } else {
> +      // If this is a linker script expression, propagate the name of the
> +      // previous section instead
> +      if (isa<ExpressionChunk<ELFT>>(*si))
> +        curOutputSectionName = prevOutputSectionName;
> +      else
> +        curOutputSectionName = (*si)->name();
> +    }
> +    bool autoCreateSlice = true;
> +    if (curOutputSectionName == prevOutputSectionName)
> +      autoCreateSlice = false;
> +    // If the newAddress computed is more than a page away, let's create
> +    // a separate segment, so that memory is not used up while running.
> +    // Dont create a slice, if the new section falls in the same output
> +    // section as the previous section.
> +    if (autoCreateSlice && ((newAddr - curAddr) >
> this->_ctx.getPageSize()) &&
> +        (_outputMagic != ELFLinkingContext::OutputMagic::NMAGIC &&
> +         _outputMagic != ELFLinkingContext::OutputMagic::OMAGIC)) {
> +      auto sliceIter =
> +        std::find_if(_segmentSlices.begin(), _segmentSlices.end(),
> +                     [startSection](SegmentSlice<ELFT> *s) -> bool {
> +                       return s->startSection() == startSection;
> +                     });
> +      if (sliceIter == _segmentSlices.end()) {
> +        slice = new (_segmentAllocate.Allocate<SegmentSlice<ELFT>>())
> +          SegmentSlice<ELFT>();
> +        _segmentSlices.push_back(slice);
> +      } else {
> +        slice = *sliceIter;
>        }
> -      // align the startOffset to the section alignment
> -      uint64_t newAddr =
> -          llvm::RoundUpToAlignment(startAddr, (*si)->alignment());
> -      // Handle linker script expressions, which *may update newAddr* if
> the
> -      // expression assigns to "."
> -      if (auto expr = dyn_cast<ExpressionChunk<ELFT>>(*si))
> -        expr->evalExpr(newAddr);
> +      slice->setStart(startSection);
> +      slice->setSections(make_range(startSectionIter, si));
> +      slice->setMemSize(curSliceSize);
> +      slice->setAlign(sliceAlign);
> +      slice->setVirtualAddr(curSliceAddress);
> +      // Start new slice
>        curSliceAddress = newAddr;
> -      sliceAlign = (*si)->alignment();
>        (*si)->setVirtualAddr(curSliceAddress);
> -
> +      startSectionIter = si;
> +      startSection = currSection;
> +      if (auto section = dyn_cast<Section<ELFT>>(*si))
> +        section->assignVirtualAddress(newAddr);
> +      curSliceSize = newAddr - curSliceAddress + (*si)->memSize();
> +      sliceAlign = (*si)->alignment();
> +    } else {
> +      if (sliceAlign < (*si)->alignment())
> +        sliceAlign = (*si)->alignment();
> +      (*si)->setVirtualAddr(newAddr);
>        // Handle TLS.
>        if (auto section = dyn_cast<Section<ELFT>>(*si)) {
>          if (section->getSegmentType() == llvm::ELF::PT_TLS) {
>            tlsStartAddr =
> -              llvm::RoundUpToAlignment(tlsStartAddr, (*si)->alignment());
> +            llvm::RoundUpToAlignment(tlsStartAddr, (*si)->alignment());
>            section->assignVirtualAddress(tlsStartAddr);
>            tlsStartAddr += (*si)->memSize();
>          } else {
>            section->assignVirtualAddress(newAddr);
>          }
>        }
> -      // TBSS section is special in that it doesn't contribute to memory
> of any
> -      // segment. If we see a tbss section, don't add memory size to addr
> The
> -      // fileOffset is automatically taken care of since TBSS section
> does not
> -      // end up using file size
> +      // TBSS section is special in that it doesn't contribute to memory
> of
> +      // any segment. If we see a tbss section, don't add memory size to
> addr
> +      // The fileOffset is automatically taken care of since TBSS section
> does
> +      // not end up using file size.
>        if ((*si)->order() != TargetLayout<ELFT>::ORDER_TBSS)
> -        curSliceSize = (*si)->memSize();
> -    } else {
> -      uint64_t curAddr = curSliceAddress + curSliceSize;
> -      if (!isDataPageAlignedForNMagic && needAlign(*si)) {
> -        // If the linker outputmagic is set to OutputMagic::NMAGIC, align
> the
> -        // Data
> -        // to a page boundary
> -        curAddr = llvm::RoundUpToAlignment(curAddr,
> this->_ctx.getPageSize());
> -        isDataPageAlignedForNMagic = true;
> -      }
> -      uint64_t newAddr = llvm::RoundUpToAlignment(curAddr,
> (*si)->alignment());
> -      // Handle linker script expressions, which *may update newAddr* if
> the
> -      // expression assigns to "."
> -      if (auto expr = dyn_cast<ExpressionChunk<ELFT>>(*si))
> -        expr->evalExpr(newAddr);
> -      Section<ELFT> *sec = dyn_cast<Section<ELFT>>(*si);
> -      StringRef curOutputSectionName;
> -      if (sec)
> -        curOutputSectionName = sec->outputSectionName();
> -      else {
> -        // If this is a linker script expression, propagate the name of
> the
> -        // previous section instead
> -        if (isa<ExpressionChunk<ELFT>>(*si))
> -          curOutputSectionName = prevOutputSectionName;
> -        else
> -          curOutputSectionName = (*si)->name();
> -      }
> -      bool autoCreateSlice = true;
> -      if (curOutputSectionName == prevOutputSectionName)
> -        autoCreateSlice = false;
> -      // If the newAddress computed is more than a page away, let's create
> -      // a separate segment, so that memory is not used up while running.
> -      // Dont create a slice, if the new section falls in the same output
> -      // section as the previous section.
> -      if (autoCreateSlice && ((newAddr - curAddr) >
> this->_ctx.getPageSize()) &&
> -          (_outputMagic != ELFLinkingContext::OutputMagic::NMAGIC &&
> -           _outputMagic != ELFLinkingContext::OutputMagic::OMAGIC)) {
> -        auto sliceIter =
> -            std::find_if(_segmentSlices.begin(), _segmentSlices.end(),
> -                         [startSection](SegmentSlice<ELFT> *s) -> bool {
> -                           return s->startSection() == startSection;
> -                         });
> -        if (sliceIter == _segmentSlices.end()) {
> -          slice = new (_segmentAllocate.Allocate<SegmentSlice<ELFT>>())
> -              SegmentSlice<ELFT>();
> -          _segmentSlices.push_back(slice);
> -        } else {
> -          slice = (*sliceIter);
> -        }
> -        slice->setStart(startSection);
> -        slice->setSections(make_range(startSectionIter, si));
> -        slice->setMemSize(curSliceSize);
> -        slice->setAlign(sliceAlign);
> -        slice->setVirtualAddr(curSliceAddress);
> -        // Start new slice
> -        curSliceAddress = newAddr;
> -        (*si)->setVirtualAddr(curSliceAddress);
> -        startSectionIter = si;
> -        startSection = currSection;
> -        if (auto section = dyn_cast<Section<ELFT>>(*si))
> -          section->assignVirtualAddress(newAddr);
>          curSliceSize = newAddr - curSliceAddress + (*si)->memSize();
> -        sliceAlign = (*si)->alignment();
> -      } else {
> -        if (sliceAlign < (*si)->alignment())
> -          sliceAlign = (*si)->alignment();
> -        (*si)->setVirtualAddr(newAddr);
> -        // Handle TLS.
> -        if (auto section = dyn_cast<Section<ELFT>>(*si)) {
> -          if (section->getSegmentType() == llvm::ELF::PT_TLS) {
> -            tlsStartAddr =
> -                llvm::RoundUpToAlignment(tlsStartAddr,
> (*si)->alignment());
> -            section->assignVirtualAddress(tlsStartAddr);
> -            tlsStartAddr += (*si)->memSize();
> -          } else {
> -            section->assignVirtualAddress(newAddr);
> -          }
> -        }
> -        // TBSS section is special in that it doesn't contribute to
> memory of
> -        // any segment. If we see a tbss section, don't add memory size
> to addr
> -        // The fileOffset is automatically taken care of since TBSS
> section does
> -        // not end up using file size.
> -        if ((*si)->order() != TargetLayout<ELFT>::ORDER_TBSS)
> -          curSliceSize = newAddr - curSliceAddress + (*si)->memSize();
> -        else
> -          curSliceSize = newAddr - curSliceAddress;
> -      }
> -      prevOutputSectionName = curOutputSectionName;
> +      else
> +        curSliceSize = newAddr - curSliceAddress;
>      }
> -    currSection++;
> +    prevOutputSectionName = curOutputSectionName;
> +    ++currSection;
>    }
> +
>    auto sliceIter = std::find_if(_segmentSlices.begin(),
> _segmentSlices.end(),
>                                  [startSection](SegmentSlice<ELFT> *s) ->
> bool {
>                                    return s->startSection() ==
> startSection;
> @@ -337,8 +339,9 @@ template <class ELFT> void Segment<ELFT>
>          SegmentSlice<ELFT>();
>      _segmentSlices.push_back(slice);
>    } else {
> -    slice = (*sliceIter);
> +    slice = *sliceIter;
>    }
> +
>    slice->setStart(startSection);
>    slice->setVirtualAddr(curSliceAddress);
>    slice->setMemSize(curSliceSize);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150414/b26abd12/attachment.html>


More information about the llvm-commits mailing list