[llvm] r188883 - MC CFG: When disassembly is impossible, fallback to data bytes.

David Blaikie dblaikie at gmail.com
Wed Aug 21 10:29:26 PDT 2013


On Wed, Aug 21, 2013 at 12:28 AM, Ahmed Bougacha
<ahmed.bougacha at gmail.com> wrote:
> Author: ab
> Date: Wed Aug 21 02:28:32 2013
> New Revision: 188883
>
> URL: http://llvm.org/viewvc/llvm-project?rev=188883&view=rev
> Log:
> MC CFG: When disassembly is impossible, fallback to data bytes.

Missing test case.

> 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.

More text about what the cleanup was, and/or doing it in a separate
patch would be good.

>
> Modified:
>     llvm/trunk/lib/MC/MCObjectDisassembler.cpp
>
> Modified: llvm/trunk/lib/MC/MCObjectDisassembler.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectDisassembler.cpp?rev=188883&r1=188882&r2=188883&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCObjectDisassembler.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectDisassembler.cpp Wed Aug 21 02:28:32 2013
> @@ -102,19 +102,29 @@ void MCObjectDisassembler::buildSectionA
>      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(MCMo
>      // 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(MCMo
>      }
>
>      // 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);
>      }
>    }
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list