clang 24.0.0git
Loans.cpp
Go to the documentation of this file.
1//===- Loans.cpp - Loan Implementation --------------------------*- 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
10
12
13void AccessPath::dump(llvm::raw_ostream &OS) const {
14 if (const clang::ValueDecl *VD = getAsValueDecl())
15 OS << VD->getNameAsString();
16 else if (const clang::MaterializeTemporaryExpr *MTE =
18 OS << "MaterializeTemporaryExpr at " << MTE;
19 else if (const PlaceholderBase *PB = getAsPlaceholderBase()) {
20 if (const auto *PVD = PB->getParmVarDecl())
21 OS << "$" << PVD->getNameAsString();
22 else if (PB->getImplicitThisParent())
23 OS << "$this";
24 else if (const auto *FD = PB->getFieldDecl())
25 OS << "$this." << FD->getNameAsString();
26 } else if (const auto *E = getAsAllocation()) {
27 if (isa<CXXNewExpr>(E))
28 OS << "NewAllocation at " << E;
29 else if (isa<CallExpr>(E))
30 OS << "HeapAllocation at " << E;
31 else
32 llvm_unreachable("unexpected allocation expression");
33 } else
34 llvm_unreachable("access path base invalid");
35 for (const auto &E : Elements)
36 E.dump(OS);
37}
38
39void Loan::dump(llvm::raw_ostream &OS) const {
40 OS << getID() << " (Path: ";
41 Path.dump(OS);
42 OS << ")";
43}
44
45const PlaceholderBase *
46LoanManager::getOrCreatePlaceholderBase(const ParmVarDecl *PVD) {
47 llvm::FoldingSetNodeID ID;
49 llvm::FoldingSetInsertToken InsertToken;
50 if (PlaceholderBase *Existing = PlaceholderBases.lookup(ID, InsertToken))
51 return Existing;
52
53 void *Mem = LoanAllocator.Allocate<PlaceholderBase>();
54 PlaceholderBase *NewPB = new (Mem) PlaceholderBase(PVD);
55 PlaceholderBases.insert(NewPB, InsertToken);
56 return NewPB;
57}
58
59const PlaceholderBase *
60LoanManager::getOrCreatePlaceholderBase(const CXXMethodDecl *MD) {
61 llvm::FoldingSetNodeID ID;
63 llvm::FoldingSetInsertToken InsertToken;
64 if (PlaceholderBase *Existing = PlaceholderBases.lookup(ID, InsertToken))
65 return Existing;
66
67 void *Mem = LoanAllocator.Allocate<PlaceholderBase>();
68 PlaceholderBase *NewPB = new (Mem) PlaceholderBase(MD);
69 PlaceholderBases.insert(NewPB, InsertToken);
70 return NewPB;
71}
72
73const PlaceholderBase *
74LoanManager::getOrCreatePlaceholderBase(const FieldDecl *FD) {
75 llvm::FoldingSetNodeID ID;
77 llvm::FoldingSetInsertToken InsertToken;
78 if (PlaceholderBase *Existing = PlaceholderBases.lookup(ID, InsertToken))
79 return Existing;
80
81 void *Mem = LoanAllocator.Allocate<PlaceholderBase>();
82 PlaceholderBase *NewPB = new (Mem) PlaceholderBase(FD);
83 PlaceholderBases.insert(NewPB, InsertToken);
84 return NewPB;
85}
86} // namespace clang::lifetimes::internal
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2153
Represents a member of a struct/union/class.
Definition Decl.h:3341
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4974
Represents a parameter to a function.
Definition Decl.h:1832
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:714
const clang::ValueDecl * getAsValueDecl() const
Definition Loans.h:155
const clang::MaterializeTemporaryExpr * getAsMaterializeTemporaryExpr() const
Definition Loans.h:159
const PlaceholderBase * getAsPlaceholderBase() const
Definition Loans.h:164
void dump(llvm::raw_ostream &OS) const
Definition Loans.cpp:13
const clang::Expr * getAsAllocation() const
Returns the allocation expression that created this loan: a CXXNewExpr or an allocating CallExpr.
Definition Loans.h:170
void dump(llvm::raw_ostream &OS) const
Definition Loans.cpp:39
Represents the base of a placeholder access path, which is a function parameter, the implicit 'this' ...
Definition Loans.h:77
static void Profile(llvm::FoldingSetNodeID &ID, KeyTy ParamMethodOrField)
Definition Loans.h:102
bool isa(CodeGen::Address addr)
Definition Address.h:330