jsji added a comment.

OK, I may not describe the example clearly.

Let me use example code with offsets and llvm internal calculations as the 
example, so that you might be clearer.

Let us say we have 2 objects , which both have weak function foo (and some 
non-weak functions).

  [2054]  m   0x110000ec0     .data     1  unamex                    
__llvm_prf_cnts
  [2056]  m   0x110000ef8     .data     1    weak                    
__profc__foo
  [1389]  m   0x110001540     .data     1  unamex                    
__llvm_prf_cnts
  [1391]  m   0x1100015a8     .data     1    weak                    
__profc__foo                <====== chosen by binder
  
  [2290]  m   0x110001ca8     .data     1  unamex                    
__llvm_prf_data
  [2292]  m   0x110001ce0     .data     1    weak                    
__profd__foo
  [1633]  m   0x110003678     .data     1  unamex                    
__llvm_prf_data
  [1635]  m   0x1100036b0     .data     1    weak                    
__profd__foo                <=======  chosen by binder

In binding, binder chose 0x1100015a8 for `__profc__foo`, and 0x1100036b0 for 
`__profd__foo`. 
(Not the 1st in the csect, but 1st seen by binder)

At the beginning `CountersDelta` is 0xfffffffffffff218. ( 0x110000ec0 [2054]  - 
0x110001ca8 [2290] ) .

The first record is for non-weak function, so we are OK.

Then we move forward to read foo counters, 
`CountersDelta` is then updated to 0xfffffffffffff1e0 ( 0xfffffffffffff218 - 
sizeof(Data))
`CounterPtr` is now 0x1100015a8 - 0x1100036b0 = 0xffffffffffffdef8

CountersOffset is now 0x1ffffffffffffda3  ( CounterPtr - CountersDelta / 
sizeof(unit64_6))

CountersOffset > MaxNumCounters !

If we have more weak symbols, the symbols chosen by binder may be  interleaving 
in the csects,
we won't be able to calculate the CountersOffset correctly for all of them.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D110422

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

Reply via email to