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 @@ -222,9 +222,11 @@ 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,34 +235,41 @@ } 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); + } else { + WithColor::warning() << "Bad disassembling at " + << format("%8\n" PRIx64, Offset); } - 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; }