David, thank you very much. That looks very much like what I was hoping for.
I'll dig into it tomorrow. Heartfelt thanks, Bob Dubner. -----Original Message----- From: David Malcolm <dmalc...@redhat.com> Sent: Monday, November 28, 2022 18:01 To: Robert Dubner <rdub...@symas.com>; gcc@gcc.gnu.org Cc: 'Bob Dubner' <rdub...@dubner.com> Subject: Re: Code generation: How to define file-scope static variables? 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