From 46937278fad5e47178b0c5f5e062eba71644231e Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Wed, 21 Aug 2013 07:28:32 +0000 Subject: MC CFG: When disassembly is impossible, fallback to data bytes. This is the behavior of sequential disassemblers (llvm-objdump, ...), when there is no instruction size hint (fixed-length, ...) While there, also do some minor cleanup. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188883 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCObjectDisassembler.cpp | 46 +++++++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 16 deletions(-) (limited to 'lib/MC/MCObjectDisassembler.cpp') diff --git a/lib/MC/MCObjectDisassembler.cpp b/lib/MC/MCObjectDisassembler.cpp index ef8fef1..8cb9a8a 100644 --- a/lib/MC/MCObjectDisassembler.cpp +++ b/lib/MC/MCObjectDisassembler.cpp @@ -102,19 +102,29 @@ void MCObjectDisassembler::buildSectionAtoms(MCModule *Module) { StringRef SecName; SI->getName(SecName); if (isText) { - MCTextAtom *Text = Module->createTextAtom(StartAddr, EndAddr); - Text->setName(SecName); + MCTextAtom *Text = 0; + MCDataAtom *InvalidData = 0; + uint64_t InstSize; for (uint64_t Index = 0; Index < SecSize; Index += InstSize) { + const uint64_t CurAddr = StartAddr + Index; MCInst Inst; - if (Dis.getInstruction(Inst, InstSize, memoryObject, Index, - nulls(), nulls())) + if (Dis.getInstruction(Inst, InstSize, memoryObject, CurAddr, nulls(), + nulls())) { + if (!Text) { + Text = Module->createTextAtom(CurAddr, CurAddr); + Text->setName(SecName); + } Text->addInst(Inst, InstSize); - else - // We don't care about splitting mixed atoms either. - llvm_unreachable("Couldn't disassemble instruction in atom."); + InvalidData = 0; + } else { + if (!InvalidData) { + Text = 0; + InvalidData = Module->createDataAtom(CurAddr, EndAddr); + } + InvalidData->addData(Contents[Index]); + } } - } else { MCDataAtom *Data = Module->createDataAtom(StartAddr, EndAddr); Data->setName(SecName); @@ -134,6 +144,8 @@ namespace { BBInfoSetTy Succs; BBInfoSetTy Preds; + BBInfo() : Atom(0), BB(0) {} + void addSucc(BBInfo &Succ) { Succs.insert(&Succ); Succ.Preds.insert(this); @@ -232,8 +244,8 @@ void MCObjectDisassembler::buildCFG(MCModule *Module) { // Create MCBBs. SmallSetVector Worklist; Worklist.insert(&BBI); - for (size_t WI = 0; WI < Worklist.size(); ++WI) { - BBInfo *BBI = Worklist[WI]; + for (size_t wi = 0; wi < Worklist.size(); ++wi) { + BBInfo *BBI = Worklist[wi]; if (!BBI->Atom) continue; BBI->BB = &MCFN.createBlock(*BBI->Atom); @@ -247,17 +259,19 @@ void MCObjectDisassembler::buildCFG(MCModule *Module) { } // Set preds/succs. - for (size_t WI = 0; WI < Worklist.size(); ++WI) { - BBInfo *BBI = Worklist[WI]; + for (size_t wi = 0; wi < Worklist.size(); ++wi) { + BBInfo *BBI = Worklist[wi]; MCBasicBlock *MCBB = BBI->BB; if (!MCBB) continue; for (BBInfoSetTy::iterator SI = BBI->Succs.begin(), SE = BBI->Succs.end(); - SI != SE; ++SI) - MCBB->addSuccessor((*SI)->BB); + SI != SE; ++SI) + if ((*SI)->BB) + MCBB->addSuccessor((*SI)->BB); for (BBInfoSetTy::iterator PI = BBI->Preds.begin(), PE = BBI->Preds.end(); - PI != PE; ++PI) - MCBB->addPredecessor((*PI)->BB); + PI != PE; ++PI) + if ((*PI)->BB) + MCBB->addPredecessor((*PI)->BB); } } } -- cgit v1.1