On Jan 17, 2008, at 1:31 AM, Duncan Sands wrote: > Hi Dale, > >> Do not mark EH tables no-dead-strip unless the >> associated function is so marked. > > can you please explain what this means?
Dead stripping is a linktime optimization, where code not reachable from main is removed. Functions can be marked no-dead-strip (__attribute__((used)) in gcc) to prevent the linker from removing them, even though they aren't obviously reachable. On Darwin the EH tables do not have a magic association with the corresponding function; they're treated as separate symbols by the linker (and there are subtle differences between the Tiger and Leopard linkers, just to make things more interesting). Generally, storage class and visibility have to match between function and table so the linker does not pick a function/table combination from different files (which doesn't work). So, if a function is marked no-dead-strip, its table must be also. The bug here was that tables were being marked no- dead-strip when the function was not; since the tables have references to the functions, this resulted in the function being kept as well; and if the functions have references to undefined externals that don't exist anywhere, you get a linktime (or, in some circumstances, dynamic linktime) crash. (If I ran the universe, people with dead code that calls undefined externals would have to clean up their code. I don't.) > And is > there a testcase? Not now. This only affects Darwin (and now SPU, but I'm pretty sure this is the right thing there too), fwiw. > Thanks! > > D. _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits