- INTEGER_CST - const_int (or const_wide_int)
- REAL_CST - const_double
const_double is easy case but const_ints are really ubiquitous, they can appear in RTX even when they do not occur in operands of asssembler`s code. So main task is to select only small subset of them. Let`s consider what we can filter out
fields offsets
Luckily this hard part has already been solved in previous part
local variables offsets in stack
RTX has field frame_related:1 in an INSN or a SET if this rtx is related to the call frame, either changing how we compute the frame address or saving and restoring registers in the prologue and epilogue
this flag affects both parts of set, for loading something from stack it looks something like:
set (reg:DI 0 ax [83])
(mem/f/c:DI (plus:DI (reg/f:DI 6 bp)
(const_int -8 [0xfffffffffffffff8]))
and for storing to stack like:
set (mem/f/c:DI (plus:DI (reg/f:DI 6 bp)
(const_int -8 [0xfffffffffffffff8])) [4 this+0 S8 A64])
(reg:DI 5 di [ _0 ]))
conditions
(set (reg:CCZ 17 flags)
(compare:CCZ (reg:QI 2 cx [orig:83 _2 ] [83])
(const_int 0 [0]))) "vtest.cc":44:19 5 {*cmpqi_ccno_1}
(jump_insn 10 9 11 2 (set (pc)
(if_then_else (eq (reg:CCZ 17 flags)
(const_int 0 [0]))
(label_ref 16)
(pc))) "vtest.cc":44:19 891 {*jcc}
EH block index
(expr_list:REG_EH_REGION (const_int 0 [0])
Now output looks much better, but probably you would like to have more control over operations types. For this purpose I add to my plugin option -fplugin-arg-gptest-ic=config.file
Lets assume that you compiling some crypto library and want to extract integer constants only for some operations - like assignments, shift and xor but not and. You can put RTX code names to config.file and prefix with '-' unneeded:
set
xor
ashift
lshiftrt
-and