Changeset 364a03c


Ignore:
Timestamp:
Dec 9, 2020, 10:05:55 AM (4 years ago)
Author:
Andrew Beach <ajbeach@…>
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
Message:

Added more information to checkAllCodeLocations.

Location:
src/Common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Common/CodeLocationTools.cpp

    r48f6252 r364a03c  
    1010// Created On       : Fri Dec  4 15:42:00 2020
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Dec  7 15:15:00 2020
    13 // Update Count     : 0
     12// Last Modified On : Wed Dec  9  9:42:00 2020
     13// Update Count     : 1
    1414//
    1515
     
    2424namespace {
    2525
     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.
    2630template<typename node_t>
    2731struct has_code_location : public std::is_base_of<ast::ParseNode, node_t> {};
     
    8387};
    8488
     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.
     189enum class LeafKind {
     190#define VISIT(node_type, return_type) node_type,
     191        ALL_VISITS(VISIT)
     192#undef VISIT
     193};
     194
     195struct 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
     207constexpr size_t leaf_kind_count = (1 + (size_t)LeafKind::TypeSubstitution);
     208
     209LeafKind get_leaf_kind( ast::Node const * node ) {
     210        LeafKindVisitor visitor;
     211        node->accept( visitor );
     212        return visitor.kind;
     213}
     214
     215const 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
    85221// Collect pointers to all the nodes with unset code locations.
    86222class CollectCore {
     
    103239
    104240void checkAllCodeLocations( ast::TranslationUnit const & unit ) {
     241        checkAllCodeLocations( "unknown location", unit );
     242}
     243
     244void checkAllCodeLocations( char const * label, ast::TranslationUnit const & unit ) {
    105245        std::list< ast::ptr< ast::Node > > unsetNodes;
    106246        {
     
    114254        }
    115255
     256        std::cerr << "Code Location check at " << label << " failed." << std::endl;
    116257        std::cerr << "Total nodes without a set code location: "
    117258                << unsetNodes.size() << std::endl;
    118259
     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
    119271        assert( unsetNodes.empty() );
    120272}
  • src/Common/CodeLocationTools.hpp

    r48f6252 r364a03c  
    1010// Created On       : Fri Dec  4 15:35:00 2020
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Dec  4 16:18:00 2020
    13 // Update Count     : 0
     12// Last Modified On : Wed Dec  9  9:53:00 2020
     13// Update Count     : 1
    1414//
    1515
    1616#pragma once
    17 
    18 // Additional tools for code locations.
    1917
    2018namespace ast {
     
    2220}
    2321
    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.
    2625void checkAllCodeLocations( ast::TranslationUnit const & unit );
     26void checkAllCodeLocations( char const *, ast::TranslationUnit const & );
    2727
    2828// Assign a nearby code-location to any unset code locations in the forest.
Note: See TracChangeset for help on using the changeset viewer.