diff options
| author | Nandor Licker <n@ndor.email> | 2019-09-13 09:46:16 +0000 |
|---|---|---|
| committer | Nandor Licker <n@ndor.email> | 2019-09-13 09:46:16 +0000 |
| commit | 950b70dcc7e3e06f7ffbb0386f82d5085cd709a9 (patch) | |
| tree | bf18f8846a4e462f83f1abcb5401129745861a97 /clang/lib/AST/Interp/Record.cpp | |
| parent | b55456aaa065167d8f93d3cf8cd83ad16d7ab4b2 (diff) | |
| download | bcm5719-llvm-950b70dcc7e3e06f7ffbb0386f82d5085cd709a9.tar.gz bcm5719-llvm-950b70dcc7e3e06f7ffbb0386f82d5085cd709a9.zip | |
[Clang Interpreter] Initial patch for the constexpr interpreter
Summary:
This patch introduces the skeleton of the constexpr interpreter,
capable of evaluating a simple constexpr functions consisting of
if statements. The interpreter is described in more detail in the
RFC. Further patches will add more features.
Reviewers: Bigcheese, jfb, rsmith
Subscribers: bruno, uenoku, ldionne, Tyker, thegameg, tschuett, dexonsmith, mgorny, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D64146
llvm-svn: 371834
Diffstat (limited to 'clang/lib/AST/Interp/Record.cpp')
| -rw-r--r-- | clang/lib/AST/Interp/Record.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/clang/lib/AST/Interp/Record.cpp b/clang/lib/AST/Interp/Record.cpp new file mode 100644 index 00000000000..f440c470505 --- /dev/null +++ b/clang/lib/AST/Interp/Record.cpp @@ -0,0 +1,46 @@ +//===--- Record.cpp - struct and class metadata for the VM ------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "Record.h" + +using namespace clang; +using namespace clang::interp; + +Record::Record(const RecordDecl *Decl, BaseList &&SrcBases, + FieldList &&SrcFields, VirtualBaseList &&SrcVirtualBases, + unsigned VirtualSize, unsigned BaseSize) + : Decl(Decl), Bases(std::move(SrcBases)), Fields(std::move(SrcFields)), + BaseSize(BaseSize), VirtualSize(VirtualSize) { + for (Base &V : SrcVirtualBases) + VirtualBases.push_back({ V.Decl, V.Offset + BaseSize, V.Desc, V.R }); + + for (Base &B : Bases) + BaseMap[B.Decl] = &B; + for (Field &F : Fields) + FieldMap[F.Decl] = &F; + for (Base &V : VirtualBases) + VirtualBaseMap[V.Decl] = &V; +} + +const Record::Field *Record::getField(const FieldDecl *FD) const { + auto It = FieldMap.find(FD); + assert(It != FieldMap.end() && "Missing field"); + return It->second; +} + +const Record::Base *Record::getBase(const RecordDecl *FD) const { + auto It = BaseMap.find(FD); + assert(It != BaseMap.end() && "Missing base"); + return It->second; +} + +const Record::Base *Record::getVirtualBase(const RecordDecl *FD) const { + auto It = VirtualBaseMap.find(FD); + assert(It != VirtualBaseMap.end() && "Missing virtual base"); + return It->second; +} |

