(** ** Combined semantics of external calls *)
(** Combining the semantics given above for the various kinds of external calls, we define the predicate [external_call] that relates: - the external function being invoked - the values of the arguments passed to this function - the memory state before the call - the result value of the call - the memory state after the call - the trace generated by the call (can be empty).  This predicate is used in the semantics of all CompCert languages. *)
Definition external_call (ef: external_function): extcall_sem :=
match ef with
| EF_external name sg  => external_functions_sem name sg
| EF_builtin name sg   => external_functions_sem name sg
| EF_runtime name sg   => external_functions_sem name sg
| EF_vload chunk       => volatile_load_sem chunk
| EF_vstore chunk      => volatile_store_sem chunk
| EF_malloc            => extcall_malloc_sem
| EF_free              => extcall_free_sem
| EF_memcpy sz al      => extcall_memcpy_sem sz al
| EF_annot kind txt targs   => extcall_annot_sem txt targs
| EF_annot_val kind txt targ => extcall_annot_val_sem txt targ
| EF_inline_asm txt sg clb => inline_assembly_sem txt sg
| EF_debug kind txt targs => extcall_debug_sem
end.

Theorem external_call_spec:
forall ef,
extcall_properties (external_call ef) (ef_sig ef).