Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Zwinkau
libfirm
Commits
7d070c58
Commit
7d070c58
authored
Apr 28, 2011
by
Matthias Braun
Browse files
improve firm profiler (based on patch by Steven Schäfer)
parent
d93e4a04
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
ir/be/be_t.h
View file @
7d070c58
...
...
@@ -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
{
...
...
ir/be/bemain.c
View file @
7d070c58
...
...
@@ -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
();
...
...
ir/ir/irprofile.c
View file @
7d070c58
This diff is collapsed.
Click to expand it.
ir/ir/irprofile.h
View file @
7d070c58
...
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment