Join GitHub today
GitHub is home to over 20 million developers working together to host and review code, manage projects, and build software together.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
|Failed to load latest commit information.|
This is RecordSize plugin for GNU C++ compiler Its aim is to detect cases where we can save some space by reorganizing fields within record. Usage: g++ -fplugin=recordsize.so some_cpp_source By default plugin will emit a warning for records for which its minimal size estimation is less then actual record size. Template instantiations are ignored. You can tweak plugin behavior using command line switches: -fplugin-arg-recordsize-process-templates - enables template instantiations processing. -fplugin-arg-recordsize-print-layout - print record layout. That allows to see which sizes/offsets/alignments are used by each field of reported records. -fplugin-arg-recordsize-print-all - print record layout for all (even not missized) records we process. -fplugin-arg-recordsize-dumpfile=filename - dump record information to given file. Dump file is appended with new record information on each next GCC invocation. This especially useful if you modify CXXFLAGS for some large project. After build is finished you can use separate tool rs-report and build report for whole project. WARNING: There is no source file updates tracking, so you have to remove dump after you've modified sources. Otherwise record data won't be updated and you'll see outdated output! Report tool usage: rs-report dumpfile [skip=skipspec] [sort=sortspec] By default rs-report will dump all records with layout in some random order. You can omit printing some type of records by adding 'skip' argument. Following letters are accepted in 'skipspec': e - skip empty records (with bases/fields) g - skip 'good' records. Record is 'good' if its actual size is less or equal to estimated minimal size. Not-estimated records are also 'good'. h - skip handled records (see caveats to know what records aren't handled) t - skip template instantiations. You can force specific sorting by adding 'sort' argument. Following letters are accepted in 'sortspec': d - sort by difference between actual size and estimated minimal size (most oversized records first). 'Good' records are left as is. s - sort by record actual size. n - sort by record name. Examples: rs-report dumpfile skip=g sort=d Print only oversized records with most oversized first. rs-report dumpfile skip=et sort=ns Print only non-template and non-empty records ordered by name and size. Caveats: Not all records are estimated. Currently we ignore records with: - bit-fields. Optimal bit-field layout is NP-hard problem (bin packing problem) - virtual bases. Vptr and virtual base are placed at the end of derived class, so this case is tricky. Minimal size estimation doesn't try to reorder bases in multiple inheritance case. It doesn't try to fit any member into padding between bases and first field.