Hi, The toplevel-extended-asm-1 test added in this commit fails on arm-none-eabi:
$ /build/r16-6691-g4faf70b615634e/bin/arm-none-eabi-gcc /build/gcc_src/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_0.c -mthumb -march=armv6s-m -mtune=cortex-m0 -mfloat-abi=soft -mfpu=auto -fdiagnostics-plain-output -O2 -flto -flto-partition=1to1 -c -o c_lto_toplevel-extended-asm-1_0.o $ /build/r16-6691-g4faf70b615634e/bin/arm-none-eabi-gcc /build/gcc_src/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_1.c -mthumb -march=armv6s-m -mtune=cortex-m0 -mfloat-abi=soft -mfpu=auto -fdiagnostics-plain-output -O2 -flto -flto-partition=1to1 -c -o c_lto_toplevel-extended-asm-1_1.o $ /build/r16-6691-g4faf70b615634e/bin/arm-none-eabi-gcc c_lto_toplevel-extended-asm-1_0.o c_lto_toplevel-extended-asm-1_1.o -mthumb -march=armv6s-m -mtune=cortex-m0 -mfloat-abi=soft -mfpu=auto -dumpbase "" -fdiagnostics-plain-output -O2 -flto -flto-partition=1to1 --specs=rdimon.specs -o gcc-dg-lto-toplevel-extended-asm-1-01.exe lto-wrapper: warning: using serial compilation of 2 LTRANS jobs lto-wrapper: note: see the '-flto' option documentation for more information /build/r16-6691-g4faf70b615634e/arm-none-eabi/bin/ld: /tmp/ccQitC6K.ltrans0.ltrans.o(asm_fn_used): Unknown destination type (ARM/Thumb) in /tmp/ccQitC6K.ltrans1.ltrans.o /tmp/ccQitC6K.ltrans1.ltrans.o: in function `local_caller': <artificial>:(.text+0xa): dangerous relocation: unsupported relocation collect2: error: ld returned 1 exit status Is this test expected to only work for x86_64-pc-linux-gnu or something similar? Note, I get the same error on r16-7687-g772499fd7e2f9a. Kind regards, Torbjörn On 2025-12-19 22:44, Michal Jires wrote:
Change in v3: Add safe_as_a<asm_node*> needed for rebase. --- Previous patch added asm_node streaming, so we need to add referenced symbols to partition. asm_nodes must be added to partition before computing the boundary. gcc/ChangeLog: * lto-cgraph.cc (compute_ltrans_boundary): Add symbols referenced from asm_nodes. * lto-streamer-out.cc (lto_output): Move adding asm_nodes to... * passes.cc (ipa_write_summaries): ...here. gcc/testsuite/ChangeLog: * gcc.dg/lto/toplevel-extended-asm-1_0.c: New test. * gcc.dg/lto/toplevel-extended-asm-1_1.c: New test. --- gcc/lto-cgraph.cc | 18 ++++++++++++++++++ gcc/lto-streamer-out.cc | 9 --------- gcc/passes.cc | 5 +++++ .../gcc.dg/lto/toplevel-extended-asm-1_0.c | 19 +++++++++++++++++++ .../gcc.dg/lto/toplevel-extended-asm-1_1.c | 12 ++++++++++++ 5 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_0.c create mode 100644 gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_1.c diff --git a/gcc/lto-cgraph.cc b/gcc/lto-cgraph.cc index 3a705463f89..4c686c45bc6 100644 --- a/gcc/lto-cgraph.cc +++ b/gcc/lto-cgraph.cc @@ -899,6 +899,24 @@ compute_ltrans_boundary (lto_symtab_encoder_t in_encoder) lto_set_symtab_encoder_encode_initializer (encoder, vnode); create_references (encoder, vnode); } + for (lsei = lsei_start (in_encoder); !lsei_end_p (lsei); lsei_next (&lsei)) + { + toplevel_node *tnode = lsei_node (lsei); + if (asm_node* node = dyn_cast <asm_node*> (tnode)) + { + symtab_node* ref; + for (unsigned i = 0; node->symbols_referenced.iterate (i, &ref); i++) + { + if (!lto_symtab_encoder_in_partition_p (encoder, ref)) + { + if (cgraph_node* cref = dyn_cast <cgraph_node*> (ref)) + add_node_to (encoder, cref, false); + else if (varpool_node *vref = dyn_cast <varpool_node *> (ref)) + lto_symtab_encoder_encode (encoder, vref); + } + } + } + } /* Pickle in also the initializer of all referenced readonly variables to help folding. Constant pool variables are not shared, so we must pickle those too. */ diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc index 1f7b81372c7..8036f0db12a 100644 --- a/gcc/lto-streamer-out.cc +++ b/gcc/lto-streamer-out.cc @@ -2817,15 +2817,6 @@ lto_output (void) lto_symtab_encoder_t encoder = lto_get_out_decl_state ()->symtab_node_encoder; auto_vec<symtab_node *> symbols_to_copy;- if (!flag_wpa)- { - asm_node *anode; - for (anode = symtab->first_asm_symbol (); - anode; - anode = safe_as_a<asm_node*>(anode->next)) - lto_set_symtab_encoder_in_partition (encoder, anode); - } - create_order_remap (encoder);prune_offload_funcs ();diff --git a/gcc/passes.cc b/gcc/passes.cc index a33c8d924a5..c2068a195cf 100644 --- a/gcc/passes.cc +++ b/gcc/passes.cc @@ -2899,6 +2899,11 @@ ipa_write_summaries (void) if (vnode->need_lto_streaming) lto_set_symtab_encoder_in_partition (encoder, vnode);+ asm_node *anode;+ for (anode = symtab->first_asm_symbol (); anode; + anode = safe_as_a<asm_node*> (anode->next)) + lto_set_symtab_encoder_in_partition (encoder, anode); + ipa_write_summaries_1 (compute_ltrans_boundary (encoder), flag_generate_offload);diff --git a/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_0.c b/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_0.cnew file mode 100644 index 00000000000..341d95ae0d5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_0.c @@ -0,0 +1,19 @@ +/* { dg-lto-do link } */ +/* { dg-lto-options {{-O2 -flto -flto-partition=1to1} } } */ + +void asm_fn(); +void asm_fn_used(); + +asm(".global %cc0\n%cc0:" :: ":" (asm_fn)); +asm(".global %cc0\n%cc0:" :: ":" (asm_fn_used)); + + +__attribute__((noinline)) +int privatized_fn(int v) { return v + v;} + +extern void call_privatized_fn(); + +int main() { + privatized_fn (0); + call_privatized_fn (); +} diff --git a/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_1.c b/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_1.c new file mode 100644 index 00000000000..0c665ffafcb --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/toplevel-extended-asm-1_1.c @@ -0,0 +1,12 @@ +extern void asm_fn_used(); + +__attribute__((used)) +void local_caller() { + asm_fn_used(); +} + +__attribute__((noipa)) +static void privatized_fn() { asm volatile ("");} +asm(".long %cc0" :: "s"(privatized_fn)); + +void call_privatized_fn() { privatized_fn();}
