On Mon, 2022-11-28 at 15:28 -0600, Robert Dubner wrote: > I am part of a team working on a COBOL front end for GCC. > > By reverse engineering other front ends, I learned, some months ago, > how > to create a function_decl GENERIC node that is the root of a GENERIC > tree > describing an entire function. > > By calling the routine cgraph_node::finalize_function() with that > function_decl, the assembly language for that function is created, > and all > is well. > > But now I need to be able to create the equivalent of a file-scope > static > variable in C. > > This C program file: > > ////////////////// > static int dubner_at_work = 123454321; > int main(int argc, char **argv) > { > } > ////////////////// > > produces, in part, this assembly language: > > ############### > .file "ccc.c" > .text > .data > .align 4 > .type dubner_at_work, @object > .size dubner_at_work, 4 > dubner_at_work: > .long 123454321 > .text > .globl main > .type main, @function > [...] > ############### > > In my own GENERIC generation code, I believe that I am creating a > proper > translation_unit_decl that contains the block and the vars nodes for > specifying "dubner_at_work". > > But I have been unable, after several days of looking, to figure out > the > equivalent of "cgraph_node::finalize_function" for a > translation_unit_decl. The resulting assembly language doesn't have > a > definition for "dubner_at_work". > > Can anybody describe how I can tell the downstream processing that I > need > the translation_unit_decl to actually define storage?
You might find libgccjit's gcc/jit/jit-playback.cc helpful for this, as it tends to contain minimal code to build trees (generally simplified/reverse-engineered from the C frontend). playback::context::global_new_decl makes the VAR_DECL node, and such trees are added to the jit playback::context's m_globals. In playback::context::replay, we have: /* Finalize globals. See how FORTRAN 95 does it in gfc_be_parse_file() for a simple reference. */ FOR_EACH_VEC_ELT (m_globals, i, global) rest_of_decl_compilation (global, true, true); wrapup_global_declarations (m_globals.address(), m_globals.length()); So you'll probably want to do something similar for your globals. Caveat: this is all reverse-engineered by me/others from the C frontend (and I haven't touched this code in a while), so I may be missing things here. Dave