> Martin Koegler wrote: > I have redone the implementation of the eeprom attribute in my prototype. > It is now a cleaner solution, but requires larger changes in the core, > but the changes in the core should not affect any backend/frontend, if > it does not uses them (except a missing case in tree_copy_mem_area, which > will cause an assertion to fail). > ... > +void > +tree_copy_mem_area (tree to, tree from) > ....
Alternatively might it make sense to utilize the analogy defined in rtl.h? /* Copy the attributes that apply to memory locations from RHS to LHS. */ #define MEM_COPY_ATTRIBUTES(LHS, RHS) \ (MEM_VOLATILE_P (LHS) = MEM_VOLATILE_P (RHS), \ MEM_IN_STRUCT_P (LHS) = MEM_IN_STRUCT_P (RHS), \ MEM_SCALAR_P (LHS) = MEM_SCALAR_P (RHS), \ MEM_NOTRAP_P (LHS) = MEM_NOTRAP_P (RHS), \ MEM_READONLY_P (LHS) = MEM_READONLY_P (RHS), \ MEM_KEEP_ALIAS_SET_P (LHS) = MEM_KEEP_ALIAS_SET_P (RHS), \ MEM_ATTRS (LHS) = MEM_ATTRS (RHS)) As unfortunately GCC already inconsistently maintains and copies attributes to memory references, it seems that introducing yet another function to do so will only likely introduce more inconsistency. Therefore wonder if it may be best to simply define MEM_ATTRS as you have done, and then consistently utilize MEM_COPY_ATTRIBUTES to properly copy attributes associated with memory references when new ones as may need to be constructed (as all effective address optimizations should be doing, as otherwise the attributes associated with the original reference will be lost). I.e.: Instead of: (as occasionally incorrectly done) rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); // some EA emit_move_insn (tmp_reg_rtx, gen_rtx_MEM (QImode, addr1)); // lose attribs emit_move_insn (addr1, gen_rtx_PLUS (Pmode, addr1, const1_rtx)); // new EA Something like this is necessary: rtx addr1 = copy_to_mode_reg (Pmode, XEXP (operands[1], 0)); // some EA rtx mem_1 = gen_rtx_MEM (QImode, addr1); // gen mem MEM_COPY_ATTRIBUTES (mem_1, operands[1]); // copy attributes emit_move_insn (tmp_reg_rtx, mem_1); // read value emit_move_insn (addr1, gen_rtx_PLUS (Pmode, addr1, const1_rtx)); // new EA