> On Mon, Jan 18, 2016 at 10:28 AM, Prathamesh Kulkarni > <prathamesh.kulka...@linaro.org> wrote: > > On 17 January 2016 at 14:56, Prathamesh Kulkarni > > <prathamesh.kulka...@linaro.org> wrote: > >> Hi, > >> I was having a look at PR69133. > >> It appears that with -flto-partition=none, > >> cgraph_node::get_untransformed_body () > >> is called twice for node with asm_name _ZThn4_N11xercesc_3_11C5m_fn6ERKi. > >> c++filt says it is: non-virtual thunk to xercesc_3_1::C::m_fn6(int const&) > >> > >> get_untransformed_body() calls > >> lto_free_function_in_decl_state_for_node() which sets > >> node->lto_file_data to NULL. > >> Now 2nd time get_untransformed_body is called for the same node, > >> node->lto_file_data is NULL and lto_get_decl_name_mapping() dereferences > >> lto_file_data which results in segfault. > >> > >> I was wondering if gating on lto_file_data could be a reasonable solution ? > >> if (!lto_file_data) > >> return false; > >> I am not sure what value to return for this case (I chose false > >> because of early exit). > >> It prevents the ICE, and the patch passes bootstrap+test on > >> x86_64-unknown-linux-gnu. > >> With partitoning enabled, for the above test-case, > >> get_untransformed_body () is called only once per node. However I > >> don't understand why it gets called twice with -flto-partition=none. > > Kugan pointed out to me the test-case doesn't ICE by passing -fno-ipa-icf. > > It looks to me we are not supposed to call this twice on the same node > but nothing guards against that (and we don't release the untransformed > body either). -flto-partition=none is special here becaue it combines WPA
You are suppose to read every function body just once from LTO stream. Doing it multiple times is a waste. You can call get_body and get_untransformed_body as many times as you want as tHere is guard: bool cgraph_node::get_untransformed_body (void) { lto_file_decl_data *file_data; const char *data, *name; size_t len; tree decl = this->decl; if (DECL_RESULT (decl)) return false; once you read the body DECL_RESULT is set. Only way you can get past this to ICE should be the case where you read the body and then trhow it away. > and late stage. IPA ICF is the only IPA pass needing untransformed bodies > during WPA. That is not exactly true. We also read untransformed bodies when merging profiles. I will check the PR. ipa-icf is not supposed to get body of thunks. Honza