On 2019-12-17 18:47 +0100, Jan Hubicka wrote: > > Would it be equivalent to: > > 1) output foo_v2 local > > 2) producing static alias with local name (.L1) > > 3) do .symver .L1,foo@@@VERS_2 > > That is somewhat more systematic and would not lead to false > > visibilities. > > I spent some time playing with this. An in order to > 1) be able to handle foo_v2 according to the resolution info > (so it behaves like a regular symbol and can be called dirrectly, > localized and optimized) > 2) get intended objdump -T relocations > 3) do not polute global symbol tables > > I ended up with the following codegen: > > .type foo_v2, @function > foo_v2: > .LFB1: > .cfi_startproc > movl $2, %eax > ret > .cfi_endproc > .LFE1: > .size foo_v2, .-foo_v2 > .globl .LSYMVER0 > .set .LSYMVER0,foo_v2 > .symver .LSYMVER0, foo@@@VERS_2 > > This uses @@@ symver version of gas which seems to have odd semantics of > requiring to be passed global symbol name which it then tkes away and > produces foo@@VERS_2. > > So the nm outoutp of the ltrans unit is: > 0000000000000000 T foo_v1 > 0000000000000010 t foo_v2 > 0000000000000000 T foo@VERS_1 > 0000000000000010 T foo@@VERS_2 > > So the difference to your patch is that foo_v2 is static which enables > normal optimizations. > > Since additional symbol alias is produced this would also make it > possible to attach multiple symver attributes with @@ string. > > Does somehting like this make sense to you? Modulo the obvious buffer > overflow issue? > Honza
Unfortunately, I got an ICE with my testcase with the patch applied to trunk. lto1: internal compiler error: tree check: expected tree that contains ‘decl minimal’ structure, have ‘identifier_node’ in do_assemble_symver, at varasm.c:5986 0x6fa648 tree_contains_struct_check_failed(tree_node const*, tree_node_structure_enum, char const*, int, char const*) ../../gcc/gcc/tree.c:9859 0x71466e contains_struct_check(tree_node*, tree_node_structure_enum, char const*, int, char const*) ../../gcc/gcc/tree.h:3387 0x71466e do_assemble_symver(tree_node*, tree_node*) ../../gcc/gcc/varasm.c:5986 0x89e409 cgraph_node::assemble_thunks_and_aliases() ../../gcc/gcc/cgraphunit.c:2225 0x89e698 cgraph_node::expand() ../../gcc/gcc/cgraphunit.c:2351 0x89f62f expand_all_functions ../../gcc/gcc/cgraphunit.c:2456 0x89f62f symbol_table::compile() ../../gcc/gcc/cgraphunit.c:2806 0x7fb589 lto_main() ../../gcc/gcc/lto/lto.c:658 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. lto-wrapper: fatal error: /home/xry111/gcc-test/bin/gcc returned 1 exit status compilation terminated. /usr/bin/ld: error: lto-wrapper failed collect2: error: ld returned 1 exit status make: *** [Makefile:4: obj/test.so] Error 1 The change to lto/lto-common.c makes sense. I tried it instead of my change to cgraph.h and everything is OK. I'll investigate the change to varasm.c a little. -- Xi Ruoyao <xry...@mengyan1223.wang> School of Aerospace Science and Technology, Xidian University