diff --git a/llvm/tools/llvm-profgen/ProfiledBinary.cpp b/llvm/tools/llvm-profgen/ProfiledBinary.cpp --- a/llvm/tools/llvm-profgen/ProfiledBinary.cpp +++ b/llvm/tools/llvm-profgen/ProfiledBinary.cpp @@ -217,14 +217,25 @@ if (ShowDisassemblyOnly) outs() << '<' << SymbolName << ">:\n"; + auto WarnInvalidInsts = [](uint64_t Start, uint64_t End) { + WithColor::warning() << "Invalid instructions at " + << format("%8" PRIx64, Start) << " - " + << format("%8" PRIx64, End) << "\n"; + }; + uint64_t Offset = StartOffset; + // Size of a consecutive invalid instruction range starting from Offset -1 + // backwards. + uint64_t InvalidInstLength = 0; while (Offset < EndOffset) { MCInst Inst; uint64_t Size; // Disassemble an instruction. - if (!DisAsm->getInstruction(Inst, Size, Bytes.slice(Offset - SectionOffset), - Offset + PreferredBaseAddress, nulls())) - return false; + bool Disassembled = + DisAsm->getInstruction(Inst, Size, Bytes.slice(Offset - SectionOffset), + Offset + PreferredBaseAddress, nulls()); + if (Size == 0) + Size = 1; if (ShowDisassemblyOnly) { if (ShowPseudoProbe) { @@ -233,38 +244,52 @@ } outs() << format("%8" PRIx64 ":", Offset); size_t Start = outs().tell(); - IPrinter->printInst(&Inst, Offset + Size, "", *STI.get(), outs()); + if (Disassembled) + IPrinter->printInst(&Inst, Offset + Size, "", *STI.get(), outs()); + else + outs() << "\t"; if (ShowSourceLocations) { unsigned Cur = outs().tell() - Start; if (Cur < 40) outs().indent(40 - Cur); - InstructionPointer Inst(this, Offset); - outs() << getReversedLocWithContext(symbolize(Inst)); + InstructionPointer IP(this, Offset); + outs() << getReversedLocWithContext(symbolize(IP)); } outs() << "\n"; } - const MCInstrDesc &MCDesc = MII->get(Inst.getOpcode()); - - // Populate a vector of the symbolized callsite at this location - // We don't need symbolized info for probe-based profile, just use an empty - // stack as an entry to indicate a valid binary offset - FrameLocationStack SymbolizedCallStack; - if (!UsePseudoProbes) { - InstructionPointer IP(this, Offset); - SymbolizedCallStack = symbolize(IP, true); + if (Disassembled) { + const MCInstrDesc &MCDesc = MII->get(Inst.getOpcode()); + // Populate a vector of the symbolized callsite at this location + // We don't need symbolized info for probe-based profile, just use an + // empty stack as an entry to indicate a valid binary offset + FrameLocationStack SymbolizedCallStack; + if (!UsePseudoProbes) { + InstructionPointer IP(this, Offset); + SymbolizedCallStack = symbolize(IP, true); + } + Offset2LocStackMap[Offset] = SymbolizedCallStack; + // Populate address maps. + CodeAddrs.push_back(Offset); + if (MCDesc.isCall()) + CallAddrs.insert(Offset); + else if (MCDesc.isReturn()) + RetAddrs.insert(Offset); + + if (InvalidInstLength) { + WarnInvalidInsts(Offset - InvalidInstLength, Offset - 1); + InvalidInstLength = 0; + } + } else { + InvalidInstLength += Size; } - Offset2LocStackMap[Offset] = SymbolizedCallStack; - // Populate address maps. - CodeAddrs.push_back(Offset); - if (MCDesc.isCall()) - CallAddrs.insert(Offset); - else if (MCDesc.isReturn()) - RetAddrs.insert(Offset); Offset += Size; } + if (InvalidInstLength) + WarnInvalidInsts(Offset - InvalidInstLength, Offset - 1); + if (ShowDisassemblyOnly) outs() << "\n";