Home | History | Annotate | Line # | Download | only in Interp
      1 //===--- Source.cpp - Source expression tracking ----------------*- C++ -*-===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 
      9 #include "Source.h"
     10 #include "clang/AST/Expr.h"
     11 
     12 using namespace clang;
     13 using namespace clang::interp;
     14 
     15 SourceLocation SourceInfo::getLoc() const {
     16   if (const Expr *E = asExpr())
     17     return E->getExprLoc();
     18   if (const Stmt *S = asStmt())
     19     return S->getBeginLoc();
     20   if (const Decl *D = asDecl())
     21     return D->getBeginLoc();
     22   return SourceLocation();
     23 }
     24 
     25 const Expr *SourceInfo::asExpr() const {
     26   if (auto *S = Source.dyn_cast<const Stmt *>())
     27     return dyn_cast<Expr>(S);
     28   return nullptr;
     29 }
     30 
     31 const Expr *SourceMapper::getExpr(Function *F, CodePtr PC) const {
     32   if (const Expr *E = getSource(F, PC).asExpr())
     33     return E;
     34   llvm::report_fatal_error("missing source expression");
     35 }
     36 
     37 SourceLocation SourceMapper::getLocation(Function *F, CodePtr PC) const {
     38   return getSource(F, PC).getLoc();
     39 }
     40