MaskRay added a comment.

I find another deficiency (infinite loop) with the current approach.

Say, there is a `je 0` (0x0F 0x84 0x00 0x00 0x00 0x00) at byte 0x90. 
(0x90+6)%32 == 0, so it ends on a 32-byte boundary.
MF.getMaxPrefixSize() is 4, so the size of MCMachineDependentFragment may vary 
from 0 to 4.
If there are other MCMachineDependentFragment's in the section, some may shrink 
while some may expand.
In some cases the following loop will not converge

  bool MCAssembler::layoutOnce(MCAsmLayout &Layout) {
    ++stats::RelaxationSteps;
  
    bool WasRelaxed = false;
    for (iterator it = begin(), ie = end(); it != ie; ++it) {
      MCSection &Sec = *it;
      while (layoutSectionOnce(Layout, Sec)) ///
        WasRelaxed = true;
    }
  
    return WasRelaxed;
  }
  
  // In MCAssembler::layoutSectionOnce,
    case MCFragment::FT_MachineDependent:
      RelaxedFrag =
          relaxMachineDependent(Layout, *cast<MCMachineDependentFragment>(I));
      break;

To give a concrete example, `clang++ -fsanitize=memory 
compiler-rt/test/msan/cxa_atexit.cpp -mbranches-within-32B-boundaries` does not 
converge. You may also try dtor-*.cpp in that directory.

A simple iterative algorithm is not guaranteed to converge. We probably can 
solve the layout problem with a dynamic programming algorithm:

f[i][j] = the minimum cost that layouts the first i instructions with j extra 
bytes (via NOPs or prefixes)
or
g[i][j] = the minimum inserted bytes that layouts the first i instructions with 
cost j

I am not clear which one is better. A simple greedy approach is to set an upper 
limit on the number of iterations when the section contains at least one 
MCMachineDependentFragment, i.e.

  bool HasMCMachineDependentFragment = false;
  int count = 5; // arbitrary. Please find an appropriate value.
  while (layoutSectionOnce(Layout, Sec, HasMCMachineDependentFragment) && count 
> 0) {
    WasRelaxed = true;
    if (HasMCMachineDependentFragment)
      count--;
  }


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70157/new/

https://reviews.llvm.org/D70157



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to