<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Hello, </span><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">I've recently changed AddressSanitizer (asan) compiler pass from ModulePass to FunctionPass and it could a bit of mayhem. </div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
The problem is that asan FunctionPass instruments a function foo, then foo gets inlined into bar, then bar gets instrumented</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
and thus the code of foo gets instrumented twice (which causes run-time crash).</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">This happens only at -O0; at -O1 we get the correct order of events for some reason (foo gets inlined, then foo and bar are instrumented). </div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
The code looks like this: </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
tools/clang/lib/CodeGen/BackendUtil.cpp</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><div>  if (LangOpts.AddressSanitizer) {                                                                                                                                                                  </div>
<div>    PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,                                                                                                                                    </div><div>                           addAddressSanitizerPass);                                                                                                                                                </div>
<div>    PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,                                                                                                                               </div><div>                           addAddressSanitizerPass);                                                                                                                                                </div>
<div>  }        </div></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">lib/Transforms/IPO/PassManagerBuilder.cpp</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
void PassManagerBuilder::populateModulePassManager(PassManagerBase &MPM) {                                                                                                                          </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<div>  // If all optimizations are disabled, just run the always-inline pass.                                                                                                                            </div><div>  if (OptLevel == 0) {                                                                                                                                                                              </div>
<div>    if (Inliner) {                                                                                                                                                                                  </div><div>      MPM.add(Inliner);                                                                                                                                                                             </div>
<div>      Inliner = 0;                                                                                                                                                                                  </div><div>    }                                                                                                                                                                                               </div>
<div>    addExtensionsToPM(EP_EnabledOnOptLevel0, MPM);                                                                                                                                                  </div><div>    return;                                                                                                                                                                                         </div>
<div>  }                        </div></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
...</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><div>  if (Inliner) {                                                                                                                                                                                    </div>
<div>    MPM.add(Inliner);                                                                                                                                                                               </div><div>    Inliner = 0;                                                                                                                                                                                    </div>
<div>  }             </div></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">...</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
  addExtensionsToPM(EP_OptimizerLast, MPM);                                                                                                                                                         </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
At O0 we use PassManagerBuilder::EP_EnabledOnOptLevel0 insertion point, at -O1+ we use PassManagerBuilder::EP_OptimizerLast, </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
but the logic looks the same. </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">What do I miss? </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Thanks!</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">--kcc </div>