diff options
author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2013-08-21 07:28:51 +0000 |
---|---|---|
committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2013-08-21 07:28:51 +0000 |
commit | 05a81020d970dc0fe8ae29e484d06aae619a4ca4 (patch) | |
tree | 8c377ac3c50b41ae4f64c448ba5cc94412314895 | |
parent | 0f4a5ba24e680f5193792822c9dd066bfccdfc2d (diff) | |
download | llvm-05a81020d970dc0fe8ae29e484d06aae619a4ca4.tar.gz llvm-05a81020d970dc0fe8ae29e484d06aae619a4ca4.tar.bz2 llvm-05a81020d970dc0fe8ae29e484d06aae619a4ca4.tar.xz |
MC CFG: Use data structures more appropriate than std::set.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188888 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/MC/MCObjectDisassembler.cpp | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/lib/MC/MCObjectDisassembler.cpp b/lib/MC/MCObjectDisassembler.cpp index 6b3ad83642..3af45371a3 100644 --- a/lib/MC/MCObjectDisassembler.cpp +++ b/lib/MC/MCObjectDisassembler.cpp @@ -8,8 +8,8 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/MCObjectDisassembler.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SetVector.h" +#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" @@ -27,7 +27,7 @@ #include "llvm/Support/StringRefMemoryObject.h" #include "llvm/Support/raw_ostream.h" #include <map> -#include <set> +#include <vector> using namespace llvm; using namespace object; @@ -149,7 +149,7 @@ void MCObjectDisassembler::buildSectionAtoms(MCModule *Module) { namespace { struct BBInfo; - typedef std::set<BBInfo*> BBInfoSetTy; + typedef SmallPtrSet<BBInfo*, 2> BBInfoSetTy; struct BBInfo { MCTextAtom *Atom; @@ -169,7 +169,7 @@ namespace { void MCObjectDisassembler::buildCFG(MCModule *Module) { typedef std::map<uint64_t, BBInfo> BBInfoByAddrTy; BBInfoByAddrTy BBInfos; - typedef std::set<uint64_t> AddressSetTy; + typedef std::vector<uint64_t> AddressSetTy; AddressSetTy Splits; AddressSetTy Calls; @@ -184,8 +184,8 @@ void MCObjectDisassembler::buildCFG(MCModule *Module) { uint64_t SymAddr; SI->getAddress(SymAddr); SymAddr = getEffectiveLoadAddr(SymAddr); - Calls.insert(SymAddr); - Splits.insert(SymAddr); + Calls.push_back(SymAddr); + Splits.push_back(SymAddr); } } @@ -198,21 +198,27 @@ void MCObjectDisassembler::buildCFG(MCModule *Module) { AI != AE; ++AI) { MCTextAtom *TA = dyn_cast<MCTextAtom>(*AI); if (!TA) continue; - Calls.insert(TA->getBeginAddr()); + Calls.push_back(TA->getBeginAddr()); BBInfos[TA->getBeginAddr()].Atom = TA; for (MCTextAtom::const_iterator II = TA->begin(), IE = TA->end(); II != IE; ++II) { if (MIA.isTerminator(II->Inst)) - Splits.insert(II->Address + II->Size); + Splits.push_back(II->Address + II->Size); uint64_t Target; if (MIA.evaluateBranch(II->Inst, II->Address, II->Size, Target)) { if (MIA.isCall(II->Inst)) - Calls.insert(Target); - Splits.insert(Target); + Calls.push_back(Target); + Splits.push_back(Target); } } } + std::sort(Splits.begin(), Splits.end()); + Splits.erase(std::unique(Splits.begin(), Splits.end()), Splits.end()); + + std::sort(Calls.begin(), Calls.end()); + Calls.erase(std::unique(Calls.begin(), Calls.end()), Calls.end()); + // Split text atoms into basic block atoms. for (AddressSetTy::const_iterator SI = Splits.begin(), SE = Splits.end(); SI != SE; ++SI) { |