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