1103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel//===- LexicalScopes.cpp - Collecting lexical scope info -*- C++ -*--------===// 2103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// 3103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// The LLVM Compiler Infrastructure 4103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// 5103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// This file is distributed under the University of Illinois Open Source 6103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// License. See LICENSE.TXT for details. 7103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// 8103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel//===----------------------------------------------------------------------===// 9103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// 10103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// This file implements LexicalScopes analysis. 11103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// 12103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// This pass collects lexical scope information and maps machine instructions 13103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// to respective lexical scopes. 14103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel// 15103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel//===----------------------------------------------------------------------===// 16103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 17103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel#ifndef LLVM_CODEGEN_LEXICALSCOPES_H 18103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel#define LLVM_CODEGEN_LEXICALSCOPES_H 19103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 20cd9f6c53de95f5301c0152cab2ccc78d653d6270Devang Patel#include "llvm/ADT/ArrayRef.h" 21103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel#include "llvm/ADT/DenseMap.h" 22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/ADT/STLExtras.h" 23103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel#include "llvm/ADT/SmallPtrSet.h" 24103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel#include "llvm/ADT/SmallVector.h" 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/DebugLoc.h" 262c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar#include "llvm/IR/DebugInfoMetadata.h" 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/ValueHandle.h" 28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <unordered_map> 29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include <utility> 30103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelnamespace llvm { 31103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 32103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelclass MachineInstr; 33103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelclass MachineBasicBlock; 34103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelclass MachineFunction; 35103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 36103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel//===----------------------------------------------------------------------===// 37103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel/// InsnRange - This is used to track range of instructions with identical 38103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel/// lexical scope. 39103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel/// 40103b8e653c981fe916b855f1b96cb35e01c4543eDevang Pateltypedef std::pair<const MachineInstr *, const MachineInstr *> InsnRange; 41103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 42103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel//===----------------------------------------------------------------------===// 43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// LexicalScope - This class is used to track scope information. 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines/// 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass LexicalScope { 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinespublic: 482c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope(LexicalScope *P, const MDLocalScope *D, const MDLocation *I, 492c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar bool A) 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : Parent(P), Desc(D), InlinedAtLocation(I), AbstractScope(A), 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LastInsn(nullptr), FirstInsn(nullptr), DFSIn(0), DFSOut(0) { 52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert((!D || D->isResolved()) && "Expected resolved node"); 53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines assert((!I || I->isResolved()) && "Expected resolved node"); 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Parent) 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Parent->addChild(this); 56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Accessors. 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LexicalScope *getParent() const { return Parent; } 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MDNode *getDesc() const { return Desc; } 612c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDLocation *getInlinedAt() const { return InlinedAtLocation; } 622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDLocalScope *getScopeNode() const { return Desc; } 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isAbstractScope() const { return AbstractScope; } 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SmallVectorImpl<LexicalScope *> &getChildren() { return Children; } 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SmallVectorImpl<InsnRange> &getRanges() { return Ranges; } 66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// addChild - Add a child scope. 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void addChild(LexicalScope *S) { Children.push_back(S); } 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// openInsnRange - This scope covers instruction range starting from MI. 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void openInsnRange(const MachineInstr *MI) { 72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!FirstInsn) 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines FirstInsn = MI; 74dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Parent) 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Parent->openInsnRange(MI); 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// extendInsnRange - Extend the current instruction range covered by 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// this scope. 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void extendInsnRange(const MachineInstr *MI) { 82dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(FirstInsn && "MI Range is not open!"); 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LastInsn = MI; 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Parent) 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Parent->extendInsnRange(MI); 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// closeInsnRange - Create a range based on FirstInsn and LastInsn collected 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// until now. This is used when a new scope is encountered while walking 90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// machine instructions. 91dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void closeInsnRange(LexicalScope *NewScope = nullptr) { 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(LastInsn && "Last insn missing!"); 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Ranges.push_back(InsnRange(FirstInsn, LastInsn)); 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines FirstInsn = nullptr; 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LastInsn = nullptr; 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // If Parent dominates NewScope then do not close Parent's instruction 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // range. 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Parent && (!NewScope || !Parent->dominates(NewScope))) 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Parent->closeInsnRange(NewScope); 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// dominates - Return true if current scope dominates given lexical scope. 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool dominates(const LexicalScope *S) const { 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (S == this) 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return true; 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (DFSIn < S->getDFSIn() && DFSOut > S->getDFSOut()) 107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return true; 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return false; 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Depth First Search support to walk and manipulate LexicalScope hierarchy. 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getDFSOut() const { return DFSOut; } 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setDFSOut(unsigned O) { DFSOut = O; } 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getDFSIn() const { return DFSIn; } 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setDFSIn(unsigned I) { DFSIn = I; } 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// dump - print lexical scope. 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void dump(unsigned Indent = 0) const; 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesprivate: 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LexicalScope *Parent; // Parent to this scope. 1222c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDLocalScope *Desc; // Debug info descriptor. 1232c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDLocation *InlinedAtLocation; // Location at which this 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // scope is inlined. 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool AbstractScope; // Abstract Scope 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SmallVector<LexicalScope *, 4> Children; // Scopes defined in scope. 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Contents not owned. 128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SmallVector<InsnRange, 4> Ranges; 129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MachineInstr *LastInsn; // Last instruction of this scope. 131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MachineInstr *FirstInsn; // First instruction of this scope. 132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned DFSIn, DFSOut; // In & Out Depth use to determine 133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // scope nesting. 134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}; 135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 136dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===----------------------------------------------------------------------===// 137103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel/// LexicalScopes - This class provides interface to collect and use lexical 138103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel/// scoping information from machine instruction. 139103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel/// 140103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelclass LexicalScopes { 141103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelpublic: 142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines LexicalScopes() : MF(nullptr), CurrentFnLexicalScope(nullptr) {} 143103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// initialize - Scan machine function and constuct lexical scope nest, resets 14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// the instance if necessary. 14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void initialize(const MachineFunction &); 147103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 148103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// releaseMemory - release memory. 14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void reset(); 15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 151103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// empty - Return true if there is any lexical scope information available. 152dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool empty() { return CurrentFnLexicalScope == nullptr; } 153103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 154103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// getCurrentFunctionScope - Return lexical scope for the current function. 15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LexicalScope *getCurrentFunctionScope() const { 15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return CurrentFnLexicalScope; 15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 158103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 1595bc942cc3cc970836d48d8ad276ef3b2b1120ffcDevang Patel /// getMachineBasicBlocks - Populate given set using machine basic blocks 1605bc942cc3cc970836d48d8ad276ef3b2b1120ffcDevang Patel /// which have machine instructions that belong to lexical scope identified by 161103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// DebugLoc. 1622c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar void getMachineBasicBlocks(const MDLocation *DL, 16337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines SmallPtrSetImpl<const MachineBasicBlock *> &MBBs); 164103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 165103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// dominates - Return true if DebugLoc's lexical scope dominates at least one 166103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// machine instruction's lexical scope in a given machine basic block. 1672c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar bool dominates(const MDLocation *DL, MachineBasicBlock *MBB); 168103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 169103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// findLexicalScope - Find lexical scope, either regular or inlined, for the 170103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// given DebugLoc. Return NULL if not found. 1712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *findLexicalScope(const MDLocation *DL); 172103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 173103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// getAbstractScopesList - Return a reference to list of abstract scopes. 174cd9f6c53de95f5301c0152cab2ccc78d653d6270Devang Patel ArrayRef<LexicalScope *> getAbstractScopesList() const { 175103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel return AbstractScopesList; 176103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel } 177103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 178dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// findAbstractScope - Find an abstract scope or return null. 1792c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *findAbstractScope(const MDLocalScope *N) { 180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto I = AbstractScopeMap.find(N); 181dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return I != AbstractScopeMap.end() ? &I->second : nullptr; 182103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel } 183103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 184ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines /// findInlinedScope - Find an inlined scope for the given scope/inlined-at. 1852c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *findInlinedScope(const MDLocalScope *N, const MDLocation *IA) { 186ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines auto I = InlinedLexicalScopeMap.find(std::make_pair(N, IA)); 187ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines return I != InlinedLexicalScopeMap.end() ? &I->second : nullptr; 188ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines } 189103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 190dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// findLexicalScope - Find regular lexical scope or return null. 1912c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *findLexicalScope(const MDLocalScope *N) { 192dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines auto I = LexicalScopeMap.find(N); 193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return I != LexicalScopeMap.end() ? &I->second : nullptr; 194103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel } 195103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 196103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// dump - Print data structures to dbgs(). 197103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel void dump(); 198103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 199c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines /// getOrCreateAbstractScope - Find or create an abstract lexical scope. 2002c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *getOrCreateAbstractScope(const MDLocalScope *Scope); 201c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 202103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelprivate: 2032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar /// getOrCreateLexicalScope - Find lexical scope for the given Scope/IA. If 204103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// not available then create new lexical scope. 2052c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *getOrCreateLexicalScope(const MDLocalScope *Scope, 2062c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDLocation *IA = nullptr); 2072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *getOrCreateLexicalScope(const MDLocation *DL) { 2082c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return DL ? getOrCreateLexicalScope(DL->getScope(), DL->getInlinedAt()) 2092c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar : nullptr; 2102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar } 211103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 212103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// getOrCreateRegularScope - Find or create a regular lexical scope. 2132c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *getOrCreateRegularScope(const MDLocalScope *Scope); 214103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 215103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// getOrCreateInlinedScope - Find or create an inlined lexical scope. 2162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope *getOrCreateInlinedScope(const MDLocalScope *Scope, 2172c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MDLocation *InlinedAt); 218103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 219103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// extractLexicalScopes - Extract instruction ranges for each lexical scopes 220103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// for the given machine function. 221103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel void extractLexicalScopes(SmallVectorImpl<InsnRange> &MIRanges, 222103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel DenseMap<const MachineInstr *, LexicalScope *> &M); 223103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel void constructScopeNest(LexicalScope *Scope); 22436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assignInstructionRanges(SmallVectorImpl<InsnRange> &MIRanges, 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DenseMap<const MachineInstr *, LexicalScope *> &M); 227103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 228103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patelprivate: 229103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel const MachineFunction *MF; 230103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 231dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// LexicalScopeMap - Tracks the scopes in the current function. 232dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Use an unordered_map to ensure value pointer validity over insertion. 2332c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar std::unordered_map<const MDLocalScope *, LexicalScope> LexicalScopeMap; 234103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 23536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// InlinedLexicalScopeMap - Tracks inlined function scopes in current 23636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// function. 2372c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar std::unordered_map<std::pair<const MDLocalScope *, const MDLocation *>, 2382c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar LexicalScope, 2392c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar pair_hash<const MDLocalScope *, const MDLocation *>> 2402c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar InlinedLexicalScopeMap; 241103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// AbstractScopeMap - These scopes are not included LexicalScopeMap. 243dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Use an unordered_map to ensure value pointer validity over insertion. 2442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar std::unordered_map<const MDLocalScope *, LexicalScope> AbstractScopeMap; 245103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 246103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// AbstractScopesList - Tracks abstract scopes constructed while processing 2471c3751c21f22f136dd577d262ea7ac1151567d01Craig Topper /// a function. 2481c3751c21f22f136dd577d262ea7ac1151567d01Craig Topper SmallVector<LexicalScope *, 4> AbstractScopesList; 249103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 250103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// CurrentFnLexicalScope - Top level scope for the current function. 251103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel /// 252103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel LexicalScope *CurrentFnLexicalScope; 253103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel}; 254103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 255103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel} // end llvm namespace 256103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel 257103b8e653c981fe916b855f1b96cb35e01c4543eDevang Patel#endif 258