public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [Ada] Tech debt: Expansion of contracts
@ 2022-09-12  8:19 Marc Poulhiès
  0 siblings, 0 replies; only message in thread
From: Marc Poulhiès @ 2022-09-12  8:19 UTC (permalink / raw)
  To: gcc-patches; +Cc: Justin Squirek

[-- Attachment #1: Type: text/plain, Size: 6825 bytes --]

This patch modifies the expansion of contracts such that the statements
and declarations of a subprogram with post-execution checks get moved to
a local internally generated subprogram which the original subprogram
calls directly followed by the required post-execution checks.

This differs from the current implementation which requires delicate
machinary which coordinates with the finalization process to emulate the
desired behavior within the "at end" procedure.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* contracts.adb, contracts.ads
	(Analyze_Pragmas_In_Declarations): Added to aid in the new
	expansion model so that pragmas relating to contracts can get
	processed early before the rest of the subprogram containing them.
	(Build_Subprogram_Contract_Wrapper): Created to do the majority of
	expansion for postconditions. It builds a local wrapper with the
	statements and declarations within a given subprogram.
	(Is_Prologue_Renaming): Moved out from Process_Preconditions to be
	used generally within the contracts package.
	(Build_Entry_Contract_Wrapper): Moved from exp_ch7.
	(Expand_Subprogram_Contract): Add new local variable Decls to
	store expanded declarations needed for evaluation of contracts.
	Call new wrapper building procedure and modify comments to match
	new expansion model.
	(Get_Postcond_Enabled): Deleted.
	(Get_Result_Object_For_Postcond): Deleted.
	(Get_Return_Success_For_Postcond): Deleted.
	(Process_Contract_Cases): Add new parameter to store declarations.
	(Process_Postconditions): Add new parameter to store declarations.
	(Process_Preconditions): Add new parameter to store declarations.
	Add code to move entry-call prologue renamings
	* einfo.ads: Document new field Wrapped_Statements and modify
	comment for Postconditions_Proc.
	* exp_attr.adb
	(Analyze_Attribute): Modify expansion of the 'Old attribute to
	recognize new expansion model and use Wrapped_Statements instead
	of Postconditions_Proc.
	* exp_ch6.adb
	(Add_Return): Remove special expansion for postconditions.
	(Expand_Call): Modify condition checking for calls to access
	subprogram wrappers to handle new expansion models.
	(Expand_Call_Helper): Remove special expansion for postconditions.
	(Expand_Non_Function_Return): Remove special expansion for
	postconditions.
	(Expand_Simple_Function_Return): Remove special expansion for
	postconditions.
	* exp_ch7.adb
	(Build_Finalizer): Deleted, but replaced by code in
	Build_Finalizer_Helper
	(Build_Finalizer_Helper): Renamed to Build_Finalizer, and special
	handling of 'Old objects removed.
	* exp_ch9.adb
	(Build_Contract_Wrapper): Renamed and moved to contracts package.
	* exp_prag.adb
	(Expand_Pragma_Contract_Cases): Delay analysis of contracts since
	they now instead get analyzed as part of the wrapper generation
	instead of after analysis of their corresponding subprogram's
	body.
	(Expand_Pragma_Check): Label expanded if-statements which come
	from the expansion of assertion statements as
	Comes_From_Check_Or_Contract.
	* freeze.adb
	(Freeze_Entity): Add special case to avoid freezing when a freeze
	node gets generated as part of the expansion of a postcondition
	check.
	* gen_il-gen-gen_nodes.adb: Add new flag
	Comes_From_Check_Or_Contract.
	* gen_il-fields.ads: Add new field Wrapped_Statements. Add new
	flag Comes_From_Check_Or_Contract.
	* gen_il-gen-gen_entities.adb: Add new field Wrapped_Statements.
	* ghost.adb
	(Is_OK_Declaration): Replace Name_uPostconditions with
	Name_uWrapped_Statements.
	(Is_OK_Statement): Simplify condition due to the loss of
	Original_Node as a result of the new expansion model of contracts
	and use new flag Comes_From_Check_Or_Contract in its place.
	* inline.adb
	(Declare_Postconditions_Result): Replace Name_uPostconditions with
	Name_uWrapped_Statements.
	(Expand_Inlined_Call): Replace Name_uPostconditions with
	Name_uWrapped_Statements.
	* lib.adb, lib.ads
	(ipu): Created to aid in debugging.
	* lib-xref.adb
	(Generate_References): Remove special handling for postcondition
	procedures.
	* sem_attr.adb
	(Analyze_Attribute_Old_Result): Add new context in which 'Old can
	appear due to the changes in expansion. Replace
	Name_uPostconditions with Name_uWrapped_Statements.
	(Result): Replace Name_uPostconditions with
	Name_uWrapped_Statements.
	* sem_ch11.adb
	(Analyze_Handled_Statements): Remove check to exclude warnings on
	useless assignments within postcondition procedures since
	postconditions no longer get isolated into separate subprograms.
	* sem_ch6.adb
	(Analyze_Generic_Subprogram_Body): Modify expansion of generic
	subprogram bodies so that contracts (and their associated pragmas)
	get analyzed first.
	(Analyze_Subprogram_Body_Helper): Remove global HSS variable due
	to the HSS of the body potentially changing during the expansion
	of contracts. In cases where it was used instead directly call
	Handled_Statement_Sequence. Modify expansion of subprogram bodies
	so that contracts (and their associated pragmas) get analyzed
	first.
	(Check_Missing_Return): Create local HSS variable instead of using
	a global one.
	(Move_Pragmas): Use new pragma table instead of an explicit list.
	* sem_elab.adb
	(Is_Postconditions_Proc): Deleted since the new scheme of
	expansion no longer divides postcondition checks to a separate
	subprogram and so cannot be easily identified (similar to
	pre-condition checks).
	(Info_Call): Remove info printing for _Postconditions subprograms.
	(Is_Assertion_Pragma_Target): Remove check for postconditions
	procedure
	(Is_Bridge_Target): Remove check for postconditions procedure.
	(Get_Invocation_Attributes): Remove unneeded local variables and
	check for postconditions procedure.
	(Output_Call): Remove info printing for _Postconditions
	subprograms.
	* sem_prag.adb, sem_prag.ads: Add new Pragma table for pragmas
	significant to subprograms, along with tech-debt comment.
	(Check_Arg_Is_Local_Name): Modified to recognize the new
	_Wrapped_Statements internal subprogram and the new expansion
	model.
	(Relocate_Pragmas_To_Body): Replace Name_uPostconditions with
	Name_uWrapped_Statements.
	* sem_res.adb
	(Resolve_Entry_Call): Add conditional to detect both contract
	based wrappers of entries, but also wrappers generated as part of
	general contract expansion (e.g. local postconditions
	subprograms).
	* sem_util.adb
	(Accessibility_Level): Verify 'Access is not taken based on a
	component of a function result.
	(Has_Significant_Contracts): Replace Name_uPostconditions with
	Name_uWrapped_Statements.
	(Same_Or_Aliased_Subprogram): Add conditional to detect and obtain
	the original subprogram based on the new concept of
	"postcondition" wrappers.
	* sinfo.ads: Add documentation for new flag
	Comes_From_Check_Or_Contract.
	* snames.ads-tmpl: Remove Name_uPostconditions and add
	Name_uWrapped_Statements

[-- Attachment #2: patch.diff.gz --]
[-- Type: application/gzip, Size: 28629 bytes --]

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-09-12  8:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-12  8:19 [Ada] Tech debt: Expansion of contracts Marc Poulhiès

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).