Hello All,
This is work done for the CHARIOT H2020 project (see
https://www.chariotproject.eu/ for more context) in relation with my
BISMON project (see http://github.com/bstarynk/bismon/ for more, and, if
you want more context, read the draft report on
http://starynkevitch.net/Basile/bismon-chariot-doc.pdf but skip the few
first pages for H2020 managers).
I have to make a preliminary proof-of-concept that my BISMON project
could be useful, with some ad-hoc GCC 8.3 plugin, to compute a crude
approximation of the call stack of a tiny freestanding kernel (for x86
in 32 bits, so compiled with: gcc-8 -ffreestanding -m32 -O2 -Wall
-fstack-usage and my plugin).
I am working right now on that hand-written GCC 8.3 plugin. It inserts
two GCC passes, and both passes are only analyzing passes (they don't
change a single bit of GIMPLE or RTL representations).
The first pass, named chariot_callgraph, is (oversimplifying) printing
the call graph (and I will improve later that pass to communicate with
BISMON). It is a pass of kind GIMPLE_PASS successfully inserted after
the reference_pass_name "sra" and it works well enough.
The second pass, named chariot_framesize, is (oversimplifying) expected
to run with the printing the call frame size (and I will improve later
that pass to communicate with BISMON).
I want to insert that second pass following this explanation (in a
comment of mine).
/* the fun->su exists as soon as -fstack-usage is passed, but it is
filled much later, by the RTL pass named "pro_and_epilogue" at
gcc-8.3.0/gcc/config/i386/i386.c:13930 in function
ix86_expand_prologue; that pass is
pass_data_thread_prologue_and_epilogue defined in gcc/function.c
line 6553 ... */
To insert that second pass, I tried many things and failed. I was
expecting that an rtl- prefix is needed for an RTL pass. My plugin_init
contains
struct register_pass_info my_framesize_pass_info;
my_framesize_pass_info.pass = make_pass_chariot_framesize (g);
//#warning the below reference pass name is wrong for
my_framesize_pass_info
my_framesize_pass_info.reference_pass_name = "rtl-pro_and_epilogue";
my_framesize_pass_info.ref_pass_instance_number = 1;
my_framesize_pass_info.pos_op = PASS_POS_INSERT_AFTER;
register_callback (plugin_name, PLUGIN_PASS_MANAGER_SETUP, NULL,
&my_framesize_pass_info);
But for some reason I cannot understand the reference_pass_name is
wrong. Using "rtl-pro_and_epilogue" don't work. And I tried many
variants without any success during several hours.
So what is the reference_pass_name to use with register_callback like
above to mention that pass_data_thread_prologue_and_epilogue defined in
gcc/function.c line 6553 ?
The entire code (of that proof-of-concept work in progress) is
temporarily available on
http://starynkevitch.net/Basile/chariotdemo-2019-Apr-10-5414f7e3a173.tar.bz2
which is a small archive of 14340 bytes. Please notice that the code I
have written in collaboration with my colleagues Franck Védrine (in BCC)
and Yves Lhuillier at CEA LIST is under GPLv3+ license. But that example
also contains some third-party tiny code taken from
https://wiki.osdev.org/Bare_Bones and in good faith we don't know what
license is that code (files kernel.c etc...) but we guess it is morally
in the public domain or open source (but we are not lawyers) since given
as an example on some wiki page.
Regards
--
Basile STARYNKEVITCH == http://starynkevitch.net/Basile
opinions are mine only - les opinions sont seulement miennes
Bourg La Reine, France