Hello, I already have some experience developing SIMPLE_IPA_PASSes, but I am looking to understand IPA_PASSes better. I have made a hello world ipa pass that stores "hello world $FUNCTION_NAME" in the function summaries; however, I am having trouble reading this information back. Can someone help me understand how to use these interfaces correctly?
At the moment, it **seems** to be writing information correctly. (I.e., it doesn't segfault when attempting to write data.) However, in my read summary function (ipa_hello_world_read_summary (void)) the function `lto_get_summary_section_data (file_data, LTO_section_ipa_hello_world, &len);` always returns NULL and `file_data_vec` is of size 1. This means that at run time, there is only one call to `lto_get_summary_section_data` and it returns NULL. I am copy-pasting the relevant code below. /* Map from cgraph_node* to "hello world $FUNCTION_NAME". */ static hash_map<cgraph_node*, char*> *hello_summaries; static void ipa_hello_world_write_summary (void) { gcc_assert(hello_summaries); struct output_block *ob = create_output_block (LTO_section_ipa_hello_world); gcc_assert(ob); if (dump_file) fprintf(dump_file, "hello world from write summary\n"); lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder; if (dump_file) fprintf(dump_file, "writing %d\n", hello_summaries->elements()); streamer_write_uhwi (ob, hello_summaries->elements()); for (auto i = hello_summaries->begin(), e = hello_summaries->end(); i != e; ++i) { if (dump_file) fprintf(dump_file, "writing %s\n", (*i).second); streamer_write_uhwi(ob, lto_symtab_encoder_encode(encoder, (*i).first)); streamer_write_string (ob, ob->main_stream, (*i).second, true); } produce_asm (ob, NULL); destroy_output_block (ob); delete hello_summaries; } static void ipa_hello_world_read_summary (void) { struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data (); struct lto_file_decl_data *file_data; unsigned int j = 0; if (dump_file) fprintf(dump_file, "hello from read summary\n"); while ((file_data = file_data_vec[j++])) { if (dump_file) fprintf(dump_file, "iteration = %d\n", j); size_t len; const char *data = lto_get_summary_section_data (file_data, LTO_section_ipa_hello_world, &len); if (!data) continue; const struct lto_function_header *header = (const struct lto_function_header*) data; gcc_assert(header); gcc_assert(header->cfg_size); const int cfg_offset = sizeof (struct lto_function_header); const int main_offset = cfg_offset + header->cfg_size; const int string_offset = main_offset + header->main_size; class data_in *data_in; lto_input_block ib ((const char *) data + main_offset, header->main_size, file_data->mode_table); data_in = lto_data_in_create (file_data, (const char *) data + string_offset, header->string_size, vNULL); unsigned int n = streamer_read_uhwi (&ib); //hello_summaries = new hash_map<cgraph_node*, char*>; for (unsigned i = 0; i < n; i++) { unsigned int index = streamer_read_uhwi(&ib); lto_symtab_encoder_t encoder = file_data->symtab_node_encoder; struct cgraph_node *cnode = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref(encoder, index)); gcc_assert(cnode); const char* string = streamer_read_string (data_in, &ib); if (dump_file) fprintf(dump_file, string); } } }