[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 1/4] xen: introduce SYMBOL
>>> On 06.02.19 at 16:41, <ian.jackson@xxxxxxxxxx> wrote: > Jan Beulich writes ("Re: [Xen-devel] [PATCH v6 1/4] xen: introduce SYMBOL"): >> As per my earlier reply, I've yet to see proof of a "code-breaking >> optimization" that actually matches our case(s). > > I have personally experienced a program being miscompiled because of > the mistaken belief by the compiler that _start and _end were > different objects. I have read haven't read back the whole history of > this but this is definitely a real bug. > > I agree with George that this is a compiler bug. However, this bug is > not going to be fixed because the compiler community's behaviour is as > unreasonable as George paints :-(. > > Our only option is some kind of bodge. > > I don't believe in the asm fragment bodge because we don't have a > promise anywhere from the compiler authors that the asm hides pointer > provenance. I am not aware of any C technique which can be reliably > used to obscure pointer provenance and prevent this kind of > misoptimisation. Linux is skating on thin ice here. > > That leaves: > > (i) define indirection variables eg end_ in an assembly language file. > (ii) convert to uintptr_t before comparing > > (i) is IMO wholly safe but it is a bit ugly and slightly less > performant. > > I think (ii) is fairly safe. I doubt that we will find (ii) broken. > In particular, because there is little motivation for compiler authors > to try to `optimise it'. If you want to be "prepared" for them taking apart asm()-s, how would you expect them to never "look through" casts? > The difficulty with it providing automatic > way of detecting when we accidentallyf fail to cast. I suggest the > following: > > extern const struct wombat _wombats_start[]; > extern const struct abstract_symbol _wombats_end[]; > > and providing a macro which compares any pointer with a struct > abstract_symbol* by converting the latter to a uintptr_t. Direct > comparisons of _wombats_start with _wombats_end will result in a > compilation error due to type mismatch. Hmm, that's certainly an interesting approach, and requires care only when introducing a new pair of symbols of this kind. But of course the macro you suggest to carry out the comparison will have the same weakness as any open coded cast to a suitable integer type. But there are benefits: - it marks problem sites clearly (one of Stefano's goals), - it isolates future changes to how exactly the comparisons are to be done to the comparison macro(s) - it doesn't undermine type safety of the main (start-of- whatever) symbols (one of my goals), - it allows the end-of-whatever symbols to also be handed to functions in a type-safe manner (we could even have per-instance structure flavors, such that unrelated "end" symbols can't be mixed up; for example the type could simply be a structure wrapping a field of the original base type). Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |