Commit 7d070c58 authored by Matthias Braun's avatar Matthias Braun
Browse files

improve firm profiler (based on patch by Steven Schäfer)

parent d93e4a04
......@@ -60,16 +60,17 @@ enum {
/** Backend options */
struct be_options_t {
unsigned dump_flags; /**< backend dumping flags */
int timing; /**< time the backend phases */
int opt_profile; /**< instrument code for profiling */
int omit_fp; /**< try to omit the frame pointer */
int pic; /**< create position independent code */
int verify_option; /**< backend verify option */
char ilp_server[128]; /**< the ilp server name */
char ilp_solver[128]; /**< the ilp solver name */
int statev; /**< enable stat event dumping */
char filtev[128]; /**< filter mask for stat events (regex is supported) */
unsigned dump_flags; /**< backend dumping flags */
int timing; /**< time the backend phases */
int opt_profile_generate; /**< instrument code for profiling */
int opt_profile_use; /**< use existing profile data */
int omit_fp; /**< try to omit the frame pointer */
int pic; /**< create position independent code */
int verify_option; /**< backend verify option */
char ilp_server[128]; /**< the ilp server name */
char ilp_solver[128]; /**< the ilp solver name */
int statev; /**< enable stat event dumping */
char filtev[128]; /**< filter mask for stat events */
};
struct be_main_env_t {
......
......@@ -81,7 +81,8 @@
static be_options_t be_options = {
DUMP_NONE, /* dump flags */
BE_TIME_OFF, /* no timing */
0, /* no opt profile */
false, /* profile_generate */
false, /* profile_use */
0, /* try to omit frame pointer */
0, /* create PIC code */
BE_VERIFY_WARN, /* verification level: warn */
......@@ -130,7 +131,8 @@ static const lc_opt_table_entry_t be_main_options[] = {
LC_OPT_ENT_BOOL ("pic", "create PIC code", &be_options.pic),
LC_OPT_ENT_ENUM_PTR ("verify", "verify the backend irg", &verify_var),
LC_OPT_ENT_BOOL ("time", "get backend timing statistics", &be_options.timing),
LC_OPT_ENT_BOOL ("profile", "instrument the code for execution count profiling", &be_options.opt_profile),
LC_OPT_ENT_BOOL ("profilegenerate", "instrument the code for execution count profiling", &be_options.opt_profile_generate),
LC_OPT_ENT_BOOL ("profileuse", "use existing profile data", &be_options.opt_profile_use),
LC_OPT_ENT_BOOL ("statev", "dump statistic events", &be_options.statev),
LC_OPT_ENT_STR ("filtev", "filter for stat events (regex if support is active", &be_options.filtev, sizeof(be_options.filtev)),
......@@ -548,18 +550,21 @@ static void be_main_loop(FILE *file_handle, const char *cup_name)
Get the filename for the profiling data.
Beware: '\0' is already included in sizeof(suffix)
*/
sprintf(prof_filename, "%.*s%s\n", (int)(sizeof(prof_filename) - sizeof(suffix)), cup_name, suffix);
/*
Next: Either instruments all irgs with profiling code
or try to read in profile data for current translation unit.
*/
if (be_options.opt_profile) {
ir_graph *prof_init_irg = ir_profile_instrument(prof_filename, profile_default);
sprintf(prof_filename, "%.*s%s",
(int)(sizeof(prof_filename) - sizeof(suffix)), cup_name, suffix);
if (be_options.opt_profile_use) {
bool res = ir_profile_read(prof_filename);
if (!res) {
fprintf(stderr, "Warning: Couldn't read profile data '%s'\n",
prof_filename);
}
}
if (be_options.opt_profile_generate) {
ir_graph *prof_init_irg
= ir_profile_instrument(prof_filename);
initialize_birg(&birgs[num_birgs], prof_init_irg, &env);
num_birgs++;
} else {
ir_profile_read(prof_filename);
}
stat_active = stat_is_active();
......
This diff is collapsed.
......@@ -27,15 +27,10 @@
#ifndef FIRM_BE_BEPROFILE_H
#define FIRM_BE_BEPROFILE_H
#include <stdbool.h>
#include "irgraph.h"
#include "irnode.h"
/** Additional flags for profiling */
enum profile_flags {
profile_with_locations = 0x0001, /**< create location table */
profile_default = 0 /**< default settings */
};
/**
* Instruments irgs with profile code
*
......@@ -44,14 +39,14 @@ enum profile_flags {
*
* @return The irg doing the profile initialization.
*/
ir_graph *ir_profile_instrument(const char *filename, unsigned flags);
ir_graph *ir_profile_instrument(const char *filename);
/**
* Reads the corresponding profile info file if it exists and returns a
* profile info struct
* @param filename The name of the file containing profile information
*/
void ir_profile_read(const char *filename);
bool ir_profile_read(const char *filename);
/**
* Frees the profile info
......@@ -61,7 +56,7 @@ void ir_profile_free(void);
/**
* Get block execution count as determined be profiling
*/
unsigned int ir_profile_get_block_execcount(const ir_node * block);
unsigned int ir_profile_get_block_execcount(const ir_node *block);
/**
* Initializes exec_freq structure for an irg based on profile data
......@@ -71,6 +66,6 @@ ir_exec_freq *ir_create_execfreqs_from_profile(ir_graph *irg);
/**
* Tells whether profile module has acquired data
*/
int ir_profile_has_data(void);
bool ir_profile_has_data(void);
#endif /* FIRM_BE_BEPROFILE_H */
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment