ScopeInfo.h revision 6b5a61b6dc400027fd793dcadceeb9da944a37ea
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- ScopeInfo.h - Information about a semantic context -----*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines FunctionScopeInfo and BlockScopeInfo. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LLVM_CLANG_SEMA_SCOPE_INFO_H 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_SEMA_SCOPE_INFO_H 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/AST/Type.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/DenseMap.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/SmallVector.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/SetVector.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace clang { 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass BlockDecl; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IdentifierInfo; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LabelStmt; 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ReturnStmt; 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Scope; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SwitchStmt; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sema { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Retains information about a function, method, or block that is 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// currently being parsed. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FunctionScopeInfo { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Whether this scope information structure defined information for 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// a block. 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool IsBlockInfo; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Whether this function contains a VLA, @try, try, C++ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// initializer, or anything else that can't be jumped past. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasBranchProtectedScope; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// \brief Whether this function contains any switches or direct gotos. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasBranchIntoScope; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Whether this function contains any indirect gotos. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasIndirectGoto; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Used to determine if errors occurred in this function or block. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DiagnosticErrorTrap ErrorTrap; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// LabelMap - This is a mapping from label identifiers to the LabelStmt for 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// it (which acts like the label decl in some ways). Forward referenced 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// labels have a LabelStmt created for them with a null location & SubStmt. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::DenseMap<IdentifierInfo*, LabelStmt*> LabelMap; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// SwitchStack - This is the current set of active switch statements in the 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// block. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::SmallVector<SwitchStmt*, 8> SwitchStack; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief The list of return statements that occur within the function or 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// block, if there is any chance of applying the named return value 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// optimization. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::SmallVector<ReturnStmt *, 4> Returns; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setHasBranchIntoScope() { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasBranchIntoScope = true; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setHasBranchProtectedScope() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasBranchProtectedScope = true; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void setHasIndirectGoto() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasIndirectGoto = true; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool NeedsScopeChecking() const { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HasIndirectGoto || 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (HasBranchProtectedScope && HasBranchIntoScope); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FunctionScopeInfo(Diagnostic &Diag) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : IsBlockInfo(false), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasBranchProtectedScope(false), 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasBranchIntoScope(false), 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasIndirectGoto(false), 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorTrap(Diag) { } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FunctionScopeInfo(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Clear out the information in this function scope, making it 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// suitable for reuse. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const FunctionScopeInfo *FSI) { return true; } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Retains information about a block that is currently being parsed. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BlockScopeInfo : public FunctionScopeInfo { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public: 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BlockDecl *TheDecl; 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// TheScope - This is the scope for the block itself, which contains 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// arguments etc. 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Scope *TheScope; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// ReturnType - The return type of the block, or null if the block 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// signature didn't provide an explicit return type. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType ReturnType; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// BlockType - The function type of the block, if one was given. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Its return type may be BuiltinType::Dependent. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QualType FunctionType; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// CaptureMap - A map of captured variables to (index+1) into Captures. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::DenseMap<VarDecl*, unsigned> CaptureMap; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Captures - The captured variables. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) llvm::SmallVector<BlockDecl::Capture, 4> Captures; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// CapturesCXXThis - Whether this block captures 'this'. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CapturesCXXThis; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BlockScopeInfo(Diagnostic &Diag, Scope *BlockScope, BlockDecl *Block) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : FunctionScopeInfo(Diag), TheDecl(Block), TheScope(BlockScope), 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturesCXXThis(false) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IsBlockInfo = true; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BlockScopeInfo(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const FunctionScopeInfo *FSI) { return FSI->IsBlockInfo; } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool classof(const BlockScopeInfo *BSI) { return true; } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)