[cfe-dev] Serialization bug

Ted Kremenek kremenek at apple.com
Sun Apr 20 20:37:46 PDT 2008


On Apr 20, 2008, at 7:22 PM, Zhongxing Xu wrote:

> The assertion fails because the DeclContext * field of i becomes 0x0  
> after deserialization.
>
> I am investigating the problem. What is the difference between InRec  
> and OutRec methods in serialization?

It's a low-level thing having to do with the bitcode file's use of  
"records".  Basically the bitcode file consists of a set of records,  
similar to XML, with special records (called "blocks") being allowed  
to contain other records in a tree-like structure.

InRec serializes out data that is basically guaranteed to remain in  
the same record.  OutRec serializes out data that is known to end the  
current record and create new ones.  Because each record adds extra  
metadata to the bitcode file, keeping things packed as much as  
possible in one record (as we do in InRec) saves space on disk.  It's  
purely an optimization thing.  For example, OutRec may call  
EmitOwnedPtr, which basically ends the current record with a  
persistent pointer ID for the next object being serialized out and a  
new record contains the data for the other object.

Here is an example:

1) EmitInt
2) EmitInt
3) EmitOwnedPtr(X)
4) EmitInt

(1) and (2) just write out the bits for an integer; EmitInt doesn't  
terminate the current record, but just adds more data to it.   
EmitOwnedPtr then writes out a single integer (in the current record)  
to represent the persistent pointer ID, then starts a new record which  
contains the data of X, then ends that record.  Then (4) is written  
out, this time in a new record (since no record is active).  This  
leads to 3 records (assuming X is contained in one record).  A more  
optimal encoding is to move (4) before (3), causing us to have 2  
records.

So... EmitInRec and EmitOutRec are just methods where we have  
collected the data that will be written in the current record  
(EmitInRec) and data that will result in the creation of other records  
(EmitOutRec).  EmitOutRec should be called after EmitInRec.

One last thing: the serialization support is incomplete.  I stopped  
fully implementing it when I got to handling EnumDecls and  
RecordDecls, since we then (and still don't) have a clear ownership  
model for all of these decls (which the serialization mechanism  
absolutely depends on).  I plan on completing it one day, but it  
wasn't pressing at the time (and I knew the ASTs would evolve and some  
of the ownership issues would get cleaned up).



More information about the cfe-dev mailing list