Files
mercury/runtime/mercury_prof.h
Mark Brown d465fa53cb Update the COPYING.LIB file and references to it.
Discussion of these changes can be found on the Mercury developers
mailing list archives from June 2018.

COPYING.LIB:
    Add a special linking exception to the LGPL.

*:
    Update references to COPYING.LIB.

    Clean up some minor errors that have accumulated in copyright
    messages.
2018-06-09 17:43:12 +10:00

94 lines
3.2 KiB
C

// vim: ts=4 sw=4 expandtab ft=c
// Copyright (C) 1995-1997,2000-2002, 2004-2005 The University of Melbourne.
// Copyright (C) 2015-2016, 2018 The Mercury team.
// This file is distributed under the terms specified in COPYING.LIB.
// mercury_prof.h -- definitions for profiling.
// (See also mercury_heap_profiling.h and mercury_deep_profiling.h.)
#ifndef MERCURY_PROF_H
#define MERCURY_PROF_H
#include "mercury_types.h" // for `MR_Code *'
#include <stdio.h>
// This variable holds the address of the "current" procedure so that
// when a profiling interrupt occurs, the profiler knows where we are,
// so that it can credit the time to the appropriate procedure.
extern MR_Code * volatile MR_prof_current_proc;
// The following two macros are used to ensure that the profiler can
// use `MR_prof_current_proc' to determine what procedure is currently
// being executed when a profiling interrupt occurs.
#ifdef MR_MPROF_PROFILE_TIME
#define MR_set_prof_current_proc(target) \
(MR_prof_current_proc = (target))
#define MR_update_prof_current_proc(target) \
(MR_prof_current_proc = (target))
#else
#define MR_set_prof_current_proc(target) ((void)0)
#define MR_update_prof_current_proc(target) ((void)0)
#endif
// This variable holds the address of the calling procedure
// for a call to mercury__do_call_closure_compact or
// mercury__do_call_class_method_compact.
#ifdef MR_MPROF_PROFILE_CALLS
extern MR_Code * MR_prof_ho_caller_proc;
#endif
#ifdef MR_MPROF_PROFILE_CALLS
#define MR_set_prof_ho_caller_proc(target) \
(MR_prof_ho_caller_proc = (target))
#else
#define MR_set_prof_ho_caller_proc(target) ((void)0)
#endif
// The MR_PROFILE() macro is used (by mercury_calls.h) to record each call.
#ifdef MR_MPROF_PROFILE_CALLS
#define MR_PROFILE(callee, caller) MR_prof_call_profile((callee), (caller))
#else
#define MR_PROFILE(callee, caller) ((void)0)
#endif
#ifdef MR_MPROF_PROFILE_CALLS
extern void MR_prof_call_profile(MR_Code *, MR_Code *);
#endif
// The prof_output_addr_decl() function is used by insert_entry() in
// mercury_label.c to record the address of each entry label.
extern void MR_prof_output_addr_decl(const char *name,
const MR_Code *address);
// The following functions are used by mercury_wrapper.c to
// initiate profiling, at the start of the program,
// to finish up profiling (writing the profiling data to files)
// at the end of the program, and to close the `Prof.Decl' file at end of
// module initialization.
// Note that prof_init() calls atexit(prof_finish), so that it can handle
// the case where the program exits by calling exit() rather than just
// returning, so it is actually not necessary to call prof_finish()
// explicitly.
extern void MR_prof_init(void);
extern void MR_prof_finish(void);
extern void MR_close_prof_decl_file(void);
#ifdef MR_MPROF_PROFILE_CALLS
extern void MR_prof_turn_on_call_profiling(void);
extern void MR_prof_turn_off_call_profiling(void);
#endif
#ifdef MR_MPROF_PROFILE_TIME
extern void MR_prof_turn_on_time_profiling(void);
extern void MR_prof_turn_off_time_profiling(void);
#endif
#endif // not MERCURY_PROF_H