CodeRegion.cpp revision 344779
1336809Sdim//===-------------------------- CodeRegion.cpp -----------------*- C++ -* -===//
2336809Sdim//
3336809Sdim//                     The LLVM Compiler Infrastructure
4336809Sdim//
5336809Sdim// This file is distributed under the University of Illinois Open Source
6336809Sdim// License. See LICENSE.TXT for details.
7336809Sdim//
8336809Sdim//===----------------------------------------------------------------------===//
9336809Sdim/// \file
10336809Sdim///
11336809Sdim/// This file implements methods from the CodeRegions interface.
12336809Sdim///
13336809Sdim//===----------------------------------------------------------------------===//
14336809Sdim
15336809Sdim#include "CodeRegion.h"
16336809Sdim
17344779Sdimnamespace llvm {
18336809Sdimnamespace mca {
19336809Sdim
20344779Sdimbool CodeRegion::isLocInRange(llvm::SMLoc Loc) const {
21336809Sdim  if (RangeEnd.isValid() && Loc.getPointer() > RangeEnd.getPointer())
22336809Sdim    return false;
23336809Sdim  if (RangeStart.isValid() && Loc.getPointer() < RangeStart.getPointer())
24336809Sdim    return false;
25336809Sdim  return true;
26336809Sdim}
27336809Sdim
28344779Sdimvoid CodeRegions::beginRegion(llvm::StringRef Description, llvm::SMLoc Loc) {
29336809Sdim  assert(!Regions.empty() && "Missing Default region");
30336809Sdim  const CodeRegion &CurrentRegion = *Regions.back();
31336809Sdim  if (CurrentRegion.startLoc().isValid() && !CurrentRegion.endLoc().isValid()) {
32344779Sdim    SM.PrintMessage(Loc, llvm::SourceMgr::DK_Warning,
33336809Sdim                    "Ignoring invalid region start");
34336809Sdim    return;
35336809Sdim  }
36336809Sdim
37336809Sdim  // Remove the default region if there are user defined regions.
38336809Sdim  if (!CurrentRegion.startLoc().isValid())
39336809Sdim    Regions.erase(Regions.begin());
40336809Sdim  addRegion(Description, Loc);
41336809Sdim}
42336809Sdim
43344779Sdimvoid CodeRegions::endRegion(llvm::SMLoc Loc) {
44336809Sdim  assert(!Regions.empty() && "Missing Default region");
45336809Sdim  CodeRegion &CurrentRegion = *Regions.back();
46336809Sdim  if (CurrentRegion.endLoc().isValid()) {
47344779Sdim    SM.PrintMessage(Loc, llvm::SourceMgr::DK_Warning,
48344779Sdim                    "Ignoring invalid region end");
49336809Sdim    return;
50336809Sdim  }
51336809Sdim
52336809Sdim  CurrentRegion.setEndLocation(Loc);
53336809Sdim}
54336809Sdim
55344779Sdimvoid CodeRegions::addInstruction(const llvm::MCInst &Instruction) {
56344779Sdim  const llvm::SMLoc &Loc = Instruction.getLoc();
57336809Sdim  const auto It =
58336809Sdim      std::find_if(Regions.rbegin(), Regions.rend(),
59336809Sdim                   [Loc](const std::unique_ptr<CodeRegion> &Region) {
60336809Sdim                     return Region->isLocInRange(Loc);
61336809Sdim                   });
62336809Sdim  if (It != Regions.rend())
63344779Sdim    (*It)->addInstruction(Instruction);
64336809Sdim}
65336809Sdim
66336809Sdim} // namespace mca
67344779Sdim} // namespace llvm
68