[PATCH, rs6000] Preserve link stack for 476 cpus

David Edelsohn dje.gcc@gmail.com
Wed Nov 2 17:39:00 GMT 2011


On Tue, Nov 1, 2011 at 3:00 PM, Peter Bergner <bergner@vnet.ibm.com> wrote:

> +/* Fills in the label name that should be used for a 476 link stack thunk.  */
> +
> +void
> +get_ppc476_thunk_name (char name[32])
> +{
> +  gcc_assert (TARGET_LINK_STACK);
> +
> +  if (HAVE_GAS_HIDDEN)
> +    sprintf (name, "__ppc476.get_thunk");
> +  else
> +    ASM_GENERATE_INTERNAL_LABEL (name, "LPPC476_", 0);
> +}
> +
> +/* This function emits the simple thunk routine that is used to preserve
> +   the link stack on the 476 cpu.  */
> +
> +static void
> +rs6000_code_end (void)
> +{
> +  char name[32];
> +  tree decl;
> +
> +  if (!TARGET_LINK_STACK)
> +    return;
> +
> +  get_ppc476_thunk_name (name);
> +
> +  decl = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, get_identifier (name),
> +                    build_function_type_list (void_type_node, NULL_TREE));
> +  DECL_RESULT (decl) = build_decl (BUILTINS_LOCATION, RESULT_DECL,
> +                                  NULL_TREE, void_type_node);
> +  TREE_PUBLIC (decl) = 1;
> +  TREE_STATIC (decl) = 1;
> +
> +  if (HAVE_GAS_HIDDEN)
> +    {
> +      DECL_COMDAT_GROUP (decl) = DECL_ASSEMBLER_NAME (decl);
> +      targetm.asm_out.unique_section (decl, 0);
> +      switch_to_section (get_named_section (decl, NULL, 0));
> +      DECL_WEAK (decl) = 1;
> +      ASM_WEAKEN_DECL (asm_out_file, decl, name, 0);
> +      targetm.asm_out.globalize_label (asm_out_file, name);
> +      targetm.asm_out.assemble_visibility (decl, VISIBILITY_HIDDEN);
> +      ASM_DECLARE_FUNCTION_NAME (asm_out_file, name, decl);
> +    }
> +  else
> +    {
> +      switch_to_section (text_section);
> +      ASM_OUTPUT_LABEL (asm_out_file, name);
> +    }
> +
> +  DECL_INITIAL (decl) = make_node (BLOCK);
> +  current_function_decl = decl;
> +  init_function_start (decl);
> +  first_function_block_is_cold = false;
> +  /* Make sure unwind info is emitted for the thunk if needed.  */
> +  final_start_function (emit_barrier (), asm_out_file, 1);
> +
> +  fputs ("\tblr\n", asm_out_file);
> +
> +  final_end_function ();
> +  init_insn_lengths ();
> +  free_after_compilation (cfun);
> +  set_cfun (NULL);
> +  current_function_decl = NULL;

The two new functions have mistakes because I did not realize the
semantics of HAVE_GAS_HIDDEN.  HAVE_GAS_HIDDEN is not a macro to be
tested at runtime, but a macro tested at compile time.

if (HAVE_GAS_HIDDEN)

should be

#ifdef HAVE_GAS_HIDDEN

Please correct.

Thanks, David



More information about the Gcc-patches mailing list