diff options
Diffstat (limited to 'gcc/ada/sem_prag.adb')
-rw-r--r-- | gcc/ada/sem_prag.adb | 82 |
1 files changed, 65 insertions, 17 deletions
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 1a847fd..cffae57 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -15545,7 +15545,11 @@ package body Sem_Prag is -- [Entity =>] LOCAL_NAME -- [Section =>] static_string_EXPRESSION); - when Pragma_Linker_Section => + when Pragma_Linker_Section => Linker_Section : declare + Arg : Node_Id; + Ent : Entity_Id; + + begin GNAT_Pragma; Check_Arg_Order ((Name_Entity, Name_Section)); Check_Arg_Count (2); @@ -15554,25 +15558,69 @@ package body Sem_Prag is Check_Arg_Is_Library_Level_Local_Name (Arg1); Check_Arg_Is_Static_Expression (Arg2, Standard_String); - -- This pragma applies to objects and types + -- Check kind of entity - if not Is_Object (Entity (Get_Pragma_Arg (Arg1))) - and then not Is_Type (Entity (Get_Pragma_Arg (Arg1))) - then - Error_Pragma_Arg - ("pragma% applies only to objects and types", Arg1); - end if; + Arg := Get_Pragma_Arg (Arg1); + Ent := Entity (Arg); - -- The only processing required is to link this item on to the - -- list of rep items for the given entity. This is accomplished - -- by the call to Rep_Item_Too_Late (when no error is detected - -- and False is returned). + case Ekind (Ent) is - if Rep_Item_Too_Late (Entity (Get_Pragma_Arg (Arg1)), N) then - return; - else - Set_Has_Gigi_Rep_Item (Entity (Get_Pragma_Arg (Arg1))); - end if; + -- Objects (constants and variables) + + when E_Constant | E_Variable => + Set_Linker_Section_Pragma (Ent, N); + + -- For now, for objects, we also link onto the rep item + -- chain and set the gigi rep item flag. This is here for + -- transition purposes only. When the processing for the + -- Linker_Section_Pragma field is completed, this can be + -- removed, since it will no longer be used. + + -- This is accomplished by the call to Rep_Item_Too_Late + -- (when no error is detected and False is returned). + + if not Rep_Item_Too_Late (Ent, N) then + Set_Has_Gigi_Rep_Item (Ent); + end if; + + -- Types + + when Type_Kind => + Set_Linker_Section_Pragma (Ent, N); + + -- Subprograms + + when Subprogram_Kind => + + -- Aspect case, entity already set + + if From_Aspect_Specification (N) then + Set_Linker_Section_Pragma + (Entity (Corresponding_Aspect (N)), N); + + -- Pragma case, we must climb the homonym chain, but skip + -- any for which the linker section is already set. + + else + loop + if No (Linker_Section_Pragma (Ent)) then + Set_Linker_Section_Pragma (Ent, N); + end if; + + Ent := Homonym (Ent); + exit when No (Ent) + or else Scope (Ent) /= Current_Scope; + end loop; + end if; + + -- All other cases are illegal + + when others => + Error_Pragma_Arg + ("pragma% applies only to objects, subprograms, and types", + Arg1); + end case; + end Linker_Section; ---------- -- List -- |