Index: test/tools/llvm-cfi-verify/X86/blacklist-expected-unprotected.s =================================================================== --- test/tools/llvm-cfi-verify/X86/blacklist-expected-unprotected.s +++ test/tools/llvm-cfi-verify/X86/blacklist-expected-unprotected.s @@ -5,7 +5,7 @@ # CHECK-LABEL: U # CHECK-NEXT: tiny.cc:11 -# CHECK-NEXT: BLACKLIST MATCH, 'src' +# CHECK-NEXT: {{^Blacklist Match:.*blacklist\.txt:1$}} # CHECK-NEXT: ====> Expected Unprotected # CHECK: Expected Protected: 0 (0.00%) Index: test/tools/llvm-cfi-verify/X86/blacklist-match-fun.s =================================================================== --- test/tools/llvm-cfi-verify/X86/blacklist-match-fun.s +++ test/tools/llvm-cfi-verify/X86/blacklist-match-fun.s @@ -5,7 +5,7 @@ # CHECK-LABEL: U # CHECK-NEXT: tiny.cc:11 -# CHECK-NEXT: BLACKLIST MATCH, 'fun' +# CHECK-NEXT: {{^Blacklist Match:.*blacklist\.txt:1$}} # CHECK-NEXT: ====> Expected Unprotected # CHECK: Expected Protected: 0 (0.00%) Index: test/tools/llvm-cfi-verify/X86/blacklist-unexpected-protected.s =================================================================== --- test/tools/llvm-cfi-verify/X86/blacklist-unexpected-protected.s +++ test/tools/llvm-cfi-verify/X86/blacklist-unexpected-protected.s @@ -5,7 +5,7 @@ # CHECK-LABEL: P # CHECK-NEXT: tiny.cc:11 -# CHECK-NEXT: BLACKLIST MATCH, 'src' +# CHECK-NEXT: {{^Blacklist Match:.*blacklist\.txt:1$}} # CHECK-NEXT: ====> Unexpected Protected # CHECK: Expected Protected: 0 (0.00%) Index: tools/llvm-cfi-verify/lib/FileAnalysis.cpp =================================================================== --- tools/llvm-cfi-verify/lib/FileAnalysis.cpp +++ tools/llvm-cfi-verify/lib/FileAnalysis.cpp @@ -370,21 +370,6 @@ InstrMeta.InstructionSize = InstructionSize; InstrMeta.Valid = ValidInstruction; - // Check if this instruction exists in the range of the DWARF metadata. - if (!IgnoreDWARFFlag) { - auto LineInfo = - Symbolizer->symbolizeCode(Object->getFileName(), VMAddress); - if (!LineInfo) { - handleAllErrors(LineInfo.takeError(), [](const ErrorInfoBase &E) { - errs() << "Symbolizer failed to get line: " << E.message() << "\n"; - }); - continue; - } - - if (LineInfo->FileName == "") - continue; - } - addInstruction(InstrMeta); if (!ValidInstruction) @@ -406,6 +391,21 @@ if (!usesRegisterOperand(InstrMeta)) continue; + // Check if this instruction exists in the range of the DWARF metadata. + if (!IgnoreDWARFFlag) { + auto LineInfo = + Symbolizer->symbolizeCode(Object->getFileName(), VMAddress); + if (!LineInfo) { + handleAllErrors(LineInfo.takeError(), [](const ErrorInfoBase &E) { + errs() << "Symbolizer failed to get line: " << E.message() << "\n"; + }); + continue; + } + + if (LineInfo->FileName == "") + continue; + } + IndirectInstructions.insert(VMAddress); } } Index: tools/llvm-cfi-verify/llvm-cfi-verify.cpp =================================================================== --- tools/llvm-cfi-verify/llvm-cfi-verify.cpp +++ tools/llvm-cfi-verify/llvm-cfi-verify.cpp @@ -47,6 +47,7 @@ uint64_t UnexpectedUnprotected = 0; symbolize::LLVMSymbolizer &Symbolizer = Analysis.getSymbolizer(); + std::map BlameCounter; for (uint64_t Address : Analysis.getIndirectInstructions()) { const auto &InstrMeta = Analysis.getInstructionOrDie(Address); @@ -97,20 +98,20 @@ continue; } - bool MatchesBlacklistRule = false; - if (SpecialCaseList->inSection("cfi-icall", "src", LineInfo.FileName) || - SpecialCaseList->inSection("cfi-vcall", "src", LineInfo.FileName)) { - outs() << "BLACKLIST MATCH, 'src'\n"; - MatchesBlacklistRule = true; - } - - if (SpecialCaseList->inSection("cfi-icall", "fun", LineInfo.FunctionName) || - SpecialCaseList->inSection("cfi-vcall", "fun", LineInfo.FunctionName)) { - outs() << "BLACKLIST MATCH, 'fun'\n"; - MatchesBlacklistRule = true; + unsigned BlameLine = 0; + for (auto &K : {"cfi-icall", "cfi-vcall"}) { + for (auto &V : + {std::make_pair("src", StringRef(LineInfo.FileName)), + std::make_pair("fun", StringRef(LineInfo.FunctionName))}) { + if (!BlameLine) + BlameLine = SpecialCaseList->inSectionBlame(K, V.first, V.second); + } } - if (MatchesBlacklistRule) { + if (BlameLine) { + outs() << "Blacklist Match: " << BlacklistFilename << ":" << BlameLine + << "\n"; + BlameCounter[BlameLine]++; if (CFIProtected) { UnexpectedProtected++; outs() << "====> Unexpected Protected\n"; @@ -149,6 +150,15 @@ ((double)ExpectedUnprotected) / IndirectCFInstructions, UnexpectedUnprotected, ((double)UnexpectedUnprotected) / IndirectCFInstructions); + + if (!SpecialCaseList) + return; + + outs() << "Blacklist Results:\n"; + for (const auto &KV : BlameCounter) { + outs() << " " << BlacklistFilename << ":" << KV.first << " affects " + << KV.second << " indirect CF instructions.\n"; + } } int main(int argc, char **argv) {