On 07/11/17 12:04, Marc-André Lureau wrote: > Hi > > ----- Original Message ----- >> On 07/06/17 12:16, Marc-André Lureau wrote: >>> Add vmcoreinfo ELF note if vmcoreinfo device is ready. >>> >>> To help the python script, add a little global vmcoreinfo_gdb >>> structure, that is populated with vmcoreinfo_gdb_update(). >>> >>> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com>
>>> @@ -181,6 +183,7 @@ static void vmcoreinfo_realize(DeviceState *dev, Error >>> **errp) >>> return; >>> } >>> >>> + vmcoreinfo_gdb_helper = VMCOREINFO(dev); >>> qemu_register_reset(vmcoreinfo_handle_reset, dev); >>> } >>> >>> >> >> I guess we don't build QEMU with link-time optimization at the >> moment. >> >> With link-time optimization, I think gcc might reasonably optimize >> away the assignment to "vmcoreinfo_gdb_helper", and >> "vmcoreinfo_gdb_helper" itself. This is why I suggested "volatile": >> >> static VMCoreInfoState * volatile vmcoreinfo_gdb_helper; >> >> Do you think volatile is only superfluous, or do you actively dislike >> it for some reason? > > Yeah, I am not convinced volatile is the best way, but nor is static. > > Let's export it? Volatile guarantees that the assignment will take place according to the behavior of the "abstract C machine" described by ISO C. From ISO C99, 6.7.3 Type qualifiers 6 An object that has volatile-qualified type may be modified in ways unknown to the implementation or have other unknown side effects. Therefore any expression referring to such an object shall be evaluated strictly according to the rules of the abstract machine, as described in 5.1.2.3. Furthermore, at every sequence point the value last stored in the object shall agree with that prescribed by the abstract machine, except as modified by the unknown factors mentioned previously. [116] What constitutes an access to an object that has volatile-qualified type is implementation-defined. Footnote 116: A volatile declaration may be used to describe an object corresponding to a memory-mapped input/output port or an object accessed by an asynchronously interrupting function. Actions on objects so declared shall not be "optimized out" by an implementation or reordered except as permitted by the rules for evaluating expressions. So basically if you can find the symbol somehow, it will always have the right value, due to the volatile qualifier, regardless of the optimizations the compiler did. Internal vs. external linkage ("static" vs. "extern") is a different question; it might affect whether you find the symbol at all. IME, symbols for objects with internal linkage are preserved, if: (a) you don't strip the final binary, and (b) gcc doesn't optimize the variable away. With link-time / full program optimization, gcc is entitled to optimize away variables with external linkage too, so "extern" in itself is not bulletproof. Volatile is more important. Given volatile, I'm sort of neutral on extern vs. static. However, if you make the variable extern, that makes abuse from other source files easier. (The variable should only be looked at with gdb.) This is also why I originally suggested to limit the scope of even the static variable to function scope -- this way abuse would completely be prevented (nothing else could access the variable even from the same translation unit), and gdb would still find the variable (IME). Thanks Laszlo