Hello, <div><br></div><div>While instrumenting LLVM IR in ThreadSanitizer (race detector), I need to distinguish between a store to vtable pointer (vptr) and any other regular store. </div><div>This special treatment should be limited to class DTORs, so I should also know when a function is a DTOR. </div>
<div>Rationale: need to distinguish benign and harmful races on vptr (<a href="http://code.google.com/p/data-race-test/wiki/PopularDataRaces#Data_race_on_vptr">http://code.google.com/p/data-race-test/wiki/PopularDataRaces#Data_race_on_vptr</a>). </div>
<div><br></div><div>Currently, I can figure out when a function is a DTOR and when a store touches vptr by analyzing mangled names.</div><div>_ZN1BD1Ev=="B::~B()"<br>_ZTV1B=="vtable for B"</div><div><br>
</div><div><div>define linkonce_odr void @_ZN1BD1Ev(%struct.B* %this) unnamed_addr nounwind uwtable align 2 {</div><div>entry:</div><div>  ....</div><div>  store i32 (...)** bitcast (i8** getelementptr inbounds ([5 x i8*]* @_ZTV1B, i64 0, i64 2) to i32 (...)**), i32 (...)*** %0, align 8</div>
</div><div><br></div><div>However, this does not sound right. </div><div>What would be the right way to pass this information from clang to LLVM?</div><div>Will using metadata for this purpose be a right solution? </div><div>
(insn-level metadata for vptr store and module-level metadata for DTORs)</div><div><br></div><div><br></div><div>Thanks, </div><div><br></div><div>--kcc </div>