summaryrefslogtreecommitdiff
path: root/lib/MC
diff options
context:
space:
mode:
authorAhmed Bougacha <ahmed.bougacha@gmail.com>2013-08-21 07:28:32 +0000
committerAhmed Bougacha <ahmed.bougacha@gmail.com>2013-08-21 07:28:32 +0000
commit46937278fad5e47178b0c5f5e062eba71644231e (patch)
tree141cd7b3a32d69ed74adeb329df64f7548b93470 /lib/MC
parent0a30cccd493e3bc82a5771ca15326f7cc8b6cb8c (diff)
downloadllvm-46937278fad5e47178b0c5f5e062eba71644231e.tar.gz
llvm-46937278fad5e47178b0c5f5e062eba71644231e.tar.bz2
llvm-46937278fad5e47178b0c5f5e062eba71644231e.tar.xz
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
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCObjectDisassembler.cpp46
1 files changed, 30 insertions, 16 deletions
diff --git a/lib/MC/MCObjectDisassembler.cpp b/lib/MC/MCObjectDisassembler.cpp
index ef8fef1a5a..8cb9a8abdf 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<BBInfo*, 16> 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);
}
}
}