[PATCH] D62888: [NewPM] Port Sancov

Leonard Chan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 14 20:36:20 PDT 2019


leonardchan added inline comments.


================
Comment at: clang/lib/CodeGen/BackendUtil.cpp:1231-1232
+      MPM.addPass(ModuleSanitizerCoveragePass(SancovOpts));
+      MPM.addPass(
+          createModuleToFunctionPassAdaptor(SanitizerCoveragePass(SancovOpts)));
+    }
----------------
chandlerc wrote:
> Is there an existing function pass pipeline we can put this in, maybe by using an extension point? That would make it much faster to run I suspect.
I tried this earlier, but when I use `registerOptimizerLastEPCallback()` before the default module pipeline is made, I end up getting this linker error for `-O2` runs:

```
fuzzer.c:(.text.sancov.module_ctor_8bit_counters[sancov.module_ctor_8bit_counters]+0x11): undefined reference to `__start___sancov_pcs'
fuzzer.c:(.text.sancov.module_ctor_8bit_counters[sancov.module_ctor_8bit_counters]+0x16): undefined reference to `__stop___sancov_pcs'
```

I don't understand how I get this because the symbols are declared in the IR dump as:

```
@__start___sancov_pcs = external hidden global i64*
@__stop___sancov_pcs = external hidden global i64*
```

for both the optimized cases if I use the adaptor or EP. I'm still linking with the same compiler-rt in each case.

The only difference I think of using the adaptor after `buildPerModuleDefaultPipeline()` vs using the extension point callback before is that the order in which the pass will be called changes, although I still don't see how it could lead to this undefined reference if I still link against compiler-rt.

Additionally, the only difference between the IR between using the adaptor vs the EP is a few extra globals/declarations seem to be missing when using the EP, which makes me think another pass that ran after this one removed them, although these don't seem to be related to the error.



================
Comment at: llvm/lib/Passes/PassRegistry.def:248
 FUNCTION_PASS("tsan", ThreadSanitizerPass())
+FUNCTION_PASS("sancov-func", SanitizerCoveragePass())
 #undef FUNCTION_PASS
----------------
chandlerc wrote:
> Consistency would suggest just `sancov` here? I don't feel strongly though.
Ah, so the reason why I don't use `sancov` here is because in the tests when using `-passes='function(sancov)', I get the following error:

```
/usr/local/google/home/leonardchan/llvm-monorepo/llvm-build-3-b133876586/bin/opt: unknown function pass '/usr/local/google/home/leonardchan/llvm-monorepo/llvm-build-3-b133876586/bin/sancov'
```

I think this is because lit tries to substitute `sancov` with the one under `bin/sancov` in my build dir. I'd be up for changing it if there's a way around this.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62888/new/

https://reviews.llvm.org/D62888





More information about the llvm-commits mailing list