- Timestamp:
- Dec 9, 2020, 10:05:55 AM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 1a2a49b
- Parents:
- 48f6252
- Location:
- src/Common
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/CodeLocationTools.cpp
r48f6252 r364a03c 10 10 // Created On : Fri Dec 4 15:42:00 2020 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Dec 7 15:15:00 202013 // Update Count : 012 // Last Modified On : Wed Dec 9 9:42:00 2020 13 // Update Count : 1 14 14 // 15 15 … … 24 24 namespace { 25 25 26 // There are a lot of helpers in this file that could be used much more 27 // generally if anyone has another use for them. 28 29 // Check if a node type has a code location. 26 30 template<typename node_t> 27 31 struct has_code_location : public std::is_base_of<ast::ParseNode, node_t> {}; … … 83 87 }; 84 88 89 // ALL_VISITS(macro) 90 // Expands `macro(node_type, return_type)` for every visit method of the 91 // ast::Visitor class where node_type is the name of the parameter and 92 // return_type is the name of the return type; not including the namespace, 93 // pointer or const qualifiers. 94 #define ALL_VISITS(macro) \ 95 macro(ObjectDecl, DeclWithType) \ 96 macro(FunctionDecl, DeclWithType) \ 97 macro(StructDecl, Decl) \ 98 macro(UnionDecl, Decl) \ 99 macro(EnumDecl, Decl) \ 100 macro(TraitDecl, Decl) \ 101 macro(TypeDecl, Decl) \ 102 macro(TypedefDecl, Decl) \ 103 macro(AsmDecl, AsmDecl) \ 104 macro(StaticAssertDecl, StaticAssertDecl) \ 105 macro(CompoundStmt, CompoundStmt) \ 106 macro(ExprStmt, Stmt) \ 107 macro(AsmStmt, Stmt) \ 108 macro(DirectiveStmt, Stmt) \ 109 macro(IfStmt, Stmt) \ 110 macro(WhileStmt, Stmt) \ 111 macro(ForStmt, Stmt) \ 112 macro(SwitchStmt, Stmt) \ 113 macro(CaseStmt, Stmt) \ 114 macro(BranchStmt, Stmt) \ 115 macro(ReturnStmt, Stmt) \ 116 macro(ThrowStmt, Stmt) \ 117 macro(TryStmt, Stmt) \ 118 macro(CatchStmt, Stmt) \ 119 macro(FinallyStmt, Stmt) \ 120 macro(SuspendStmt, Stmt) \ 121 macro(WaitForStmt, Stmt) \ 122 macro(WithStmt, Decl) \ 123 macro(NullStmt, NullStmt) \ 124 macro(DeclStmt, Stmt) \ 125 macro(ImplicitCtorDtorStmt, Stmt) \ 126 macro(ApplicationExpr, Expr) \ 127 macro(UntypedExpr, Expr) \ 128 macro(NameExpr, Expr) \ 129 macro(AddressExpr, Expr) \ 130 macro(LabelAddressExpr, Expr) \ 131 macro(CastExpr, Expr) \ 132 macro(KeywordCastExpr, Expr) \ 133 macro(VirtualCastExpr, Expr) \ 134 macro(UntypedMemberExpr, Expr) \ 135 macro(MemberExpr, Expr) \ 136 macro(VariableExpr, Expr) \ 137 macro(ConstantExpr, Expr) \ 138 macro(SizeofExpr, Expr) \ 139 macro(AlignofExpr, Expr) \ 140 macro(UntypedOffsetofExpr, Expr) \ 141 macro(OffsetofExpr, Expr) \ 142 macro(OffsetPackExpr, Expr) \ 143 macro(LogicalExpr, Expr) \ 144 macro(ConditionalExpr, Expr) \ 145 macro(CommaExpr, Expr) \ 146 macro(TypeExpr, Expr) \ 147 macro(AsmExpr, Expr) \ 148 macro(ImplicitCopyCtorExpr, Expr) \ 149 macro(ConstructorExpr, Expr) \ 150 macro(CompoundLiteralExpr, Expr) \ 151 macro(RangeExpr, Expr) \ 152 macro(UntypedTupleExpr, Expr) \ 153 macro(TupleExpr, Expr) \ 154 macro(TupleIndexExpr, Expr) \ 155 macro(TupleAssignExpr, Expr) \ 156 macro(StmtExpr, Expr) \ 157 macro(UniqueExpr, Expr) \ 158 macro(UntypedInitExpr, Expr) \ 159 macro(InitExpr, Expr) \ 160 macro(DeletedExpr, Expr) \ 161 macro(DefaultArgExpr, Expr) \ 162 macro(GenericExpr, Expr) \ 163 macro(VoidType, Type) \ 164 macro(BasicType, Type) \ 165 macro(PointerType, Type) \ 166 macro(ArrayType, Type) \ 167 macro(ReferenceType, Type) \ 168 macro(QualifiedType, Type) \ 169 macro(FunctionType, Type) \ 170 macro(StructInstType, Type) \ 171 macro(UnionInstType, Type) \ 172 macro(EnumInstType, Type) \ 173 macro(TraitInstType, Type) \ 174 macro(TypeInstType, Type) \ 175 macro(TupleType, Type) \ 176 macro(TypeofType, Type) \ 177 macro(VarArgsType, Type) \ 178 macro(ZeroType, Type) \ 179 macro(OneType, Type) \ 180 macro(GlobalScopeType, Type) \ 181 macro(Designation, Designation) \ 182 macro(SingleInit, Init) \ 183 macro(ListInit, Init) \ 184 macro(ConstructorInit, Init) \ 185 macro(Attribute, Attribute) \ 186 macro(TypeSubstitution, TypeSubstitution) 187 188 // These could even go into the ast namespace. 189 enum class LeafKind { 190 #define VISIT(node_type, return_type) node_type, 191 ALL_VISITS(VISIT) 192 #undef VISIT 193 }; 194 195 struct LeafKindVisitor : public ast::Visitor { 196 LeafKind kind; 197 198 #define VISIT(node_type, return_type) \ 199 const ast::return_type * visit( const ast::node_type * ) final { \ 200 kind = LeafKind::node_type; \ 201 return nullptr; \ 202 } 203 ALL_VISITS(VISIT) 204 #undef VISIT 205 }; 206 207 constexpr size_t leaf_kind_count = (1 + (size_t)LeafKind::TypeSubstitution); 208 209 LeafKind get_leaf_kind( ast::Node const * node ) { 210 LeafKindVisitor visitor; 211 node->accept( visitor ); 212 return visitor.kind; 213 } 214 215 const char * leaf_kind_names[leaf_kind_count] = { 216 #define VISIT(node_type, return_type) #node_type, 217 ALL_VISITS(VISIT) 218 #undef VISIT 219 }; 220 85 221 // Collect pointers to all the nodes with unset code locations. 86 222 class CollectCore { … … 103 239 104 240 void checkAllCodeLocations( ast::TranslationUnit const & unit ) { 241 checkAllCodeLocations( "unknown location", unit ); 242 } 243 244 void checkAllCodeLocations( char const * label, ast::TranslationUnit const & unit ) { 105 245 std::list< ast::ptr< ast::Node > > unsetNodes; 106 246 { … … 114 254 } 115 255 256 std::cerr << "Code Location check at " << label << " failed." << std::endl; 116 257 std::cerr << "Total nodes without a set code location: " 117 258 << unsetNodes.size() << std::endl; 118 259 260 size_t node_counts[leaf_kind_count] = {0}; 261 for ( auto unset : unsetNodes ) { 262 node_counts[(size_t)get_leaf_kind(unset)] += 1; 263 } 264 for ( size_t i = 0 ; i < leaf_kind_count ; ++i ) { 265 if ( node_counts[i] ) { 266 std::cerr << '\t' << node_counts[i] 267 << " of type " << leaf_kind_names[i] << std::endl; 268 } 269 } 270 119 271 assert( unsetNodes.empty() ); 120 272 } -
src/Common/CodeLocationTools.hpp
r48f6252 r364a03c 10 10 // Created On : Fri Dec 4 15:35:00 2020 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Dec 4 16:18:00 202013 // Update Count : 012 // Last Modified On : Wed Dec 9 9:53:00 2020 13 // Update Count : 1 14 14 // 15 15 16 16 #pragma once 17 18 // Additional tools for code locations.19 17 20 18 namespace ast { … … 22 20 } 23 21 24 /// Search the translation unit for unset code locations and print information 25 /// on them. Abort if any unset code locations are found. 22 // Search the translation unit for unset code locations and print information 23 // on them, and where the check was run if provided. Abort if any unset code 24 // locations are found. 26 25 void checkAllCodeLocations( ast::TranslationUnit const & unit ); 26 void checkAllCodeLocations( char const *, ast::TranslationUnit const & ); 27 27 28 28 // Assign a nearby code-location to any unset code locations in the forest.
Note: See TracChangeset
for help on using the changeset viewer.