diff options
Diffstat (limited to 'tools/llvm-mca/CodeRegion.cpp')
| -rw-r--r-- | tools/llvm-mca/CodeRegion.cpp | 66 | 
1 files changed, 66 insertions, 0 deletions
diff --git a/tools/llvm-mca/CodeRegion.cpp b/tools/llvm-mca/CodeRegion.cpp new file mode 100644 index 0000000000000..8968659965042 --- /dev/null +++ b/tools/llvm-mca/CodeRegion.cpp @@ -0,0 +1,66 @@ +//===-------------------------- CodeRegion.cpp -----------------*- C++ -* -===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// \file +/// +/// This file implements methods from the CodeRegions interface. +/// +//===----------------------------------------------------------------------===// + +#include "CodeRegion.h" + +using namespace llvm; + +namespace mca { + +bool CodeRegion::isLocInRange(SMLoc Loc) const { +  if (RangeEnd.isValid() && Loc.getPointer() > RangeEnd.getPointer()) +    return false; +  if (RangeStart.isValid() && Loc.getPointer() < RangeStart.getPointer()) +    return false; +  return true; +} + +void CodeRegions::beginRegion(StringRef Description, SMLoc Loc) { +  assert(!Regions.empty() && "Missing Default region"); +  const CodeRegion &CurrentRegion = *Regions.back(); +  if (CurrentRegion.startLoc().isValid() && !CurrentRegion.endLoc().isValid()) { +    SM.PrintMessage(Loc, SourceMgr::DK_Warning, +                    "Ignoring invalid region start"); +    return; +  } + +  // Remove the default region if there are user defined regions. +  if (!CurrentRegion.startLoc().isValid()) +    Regions.erase(Regions.begin()); +  addRegion(Description, Loc); +} + +void CodeRegions::endRegion(SMLoc Loc) { +  assert(!Regions.empty() && "Missing Default region"); +  CodeRegion &CurrentRegion = *Regions.back(); +  if (CurrentRegion.endLoc().isValid()) { +    SM.PrintMessage(Loc, SourceMgr::DK_Warning, "Ignoring invalid region end"); +    return; +  } + +  CurrentRegion.setEndLocation(Loc); +} + +void CodeRegions::addInstruction(std::unique_ptr<const MCInst> Instruction) { +  const SMLoc &Loc = Instruction->getLoc(); +  const auto It = +      std::find_if(Regions.rbegin(), Regions.rend(), +                   [Loc](const std::unique_ptr<CodeRegion> &Region) { +                     return Region->isLocInRange(Loc); +                   }); +  if (It != Regions.rend()) +    (*It)->addInstruction(std::move(Instruction)); +} + +} // namespace mca  | 
