Now 'writer' creates an instance of RuntimeFile in the constructor, then populates the file in the virtual function addDefaultAtoms, then pass owning of this file to the caller of virtual function createImplicitFiles.
First, we do not need to keep an instance of RuntimeFile so long. It is enough to create the file, right after that populate it and pass the owning.
Second, relationship between createImplicitFiles and addDefaultAtoms is complicated. The createImplicitFiles might call addDefaultAtoms, overridden version of addDefaultAtoms might call base class addDefaultAtoms, and overridden version of createImplicitFiles might call base class createImplicitFiles as well as addDefaultAtoms.
The patch solves both problems above. It creates and populates runtime files right in the createImplicitFiles(), removes addDefaultAtoms at all and does not keep references to runtime files in class fields.
addAbsoluteAtom returns a pointer to a new atom, so we discard the pointer here. Looks like we don't use return values from the function at all. This doesn't have to be done in this patch, but we should make the function return void.