- Timestamp:
- Nov 9, 2016, 2:51:42 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 30b65d8, d073e3c
- Parents:
- 141b786 (diff), 84118d8 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 23 edited
-
ControlStruct/LabelFixer.h (modified) (2 diffs)
-
GenPoly/Box.cc (modified) (5 diffs)
-
GenPoly/InstantiateGeneric.cc (modified) (2 diffs)
-
GenPoly/Specialize.cc (modified) (1 diff)
-
InitTweak/FixInit.cc (modified) (11 diffs)
-
InitTweak/GenInit.cc (modified) (6 diffs)
-
InitTweak/InitTweak.h (modified) (2 diffs)
-
Makefile.am (modified) (2 diffs)
-
Makefile.in (modified) (3 diffs)
-
Parser/ParseNode.h (modified) (4 diffs)
-
ResolvExpr/AlternativeFinder.h (modified) (1 diff)
-
ResolvExpr/AlternativePrinter.h (modified) (2 diffs)
-
ResolvExpr/Resolver.cc (modified) (3 diffs)
-
ResolvExpr/TypeMap.h (modified) (10 diffs)
-
ResolvExpr/Unify.cc (modified) (1 diff)
-
SymTab/Validate.cc (modified) (3 diffs)
-
driver/Makefile.am (modified) (2 diffs)
-
driver/Makefile.in (modified) (2 diffs)
-
driver/cfa.cc (modified) (2 diffs)
-
examples/Makefile.in (modified) (1 diff)
-
libcfa/Makefile.in (modified) (1 diff)
-
main.cc (modified) (6 diffs)
-
tests/Makefile.in (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
src/ControlStruct/LabelFixer.h
r141b786 rb726084 26 26 namespace ControlStruct { 27 27 /// normalizes label definitions and generates multi-level exit labels 28 class LabelFixer : public Visitor {28 class LabelFixer final : public Visitor { 29 29 typedef Visitor Parent; 30 30 public: … … 33 33 std::map < Label, Statement * > *resolveJumps() throw ( SemanticError ); 34 34 35 using Visitor::visit; 36 35 37 // Declarations 36 virtual void visit( FunctionDecl *functionDecl ) ;38 virtual void visit( FunctionDecl *functionDecl ) override; 37 39 38 40 // Statements 39 41 void visit( Statement *stmt ); 40 42 41 virtual void visit( CompoundStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }42 virtual void visit( NullStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }43 virtual void visit( ExprStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }44 virtual void visit( IfStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }45 virtual void visit( WhileStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }46 virtual void visit( ForStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }47 virtual void visit( SwitchStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }48 virtual void visit( CaseStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }49 virtual void visit( ReturnStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }50 virtual void visit( TryStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }51 virtual void visit( CatchStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }52 virtual void visit( DeclStmt *stmt ) { visit( (Statement *)stmt ); return Parent::visit( stmt ); }53 virtual void visit( BranchStmt *branchStmt ) ;54 virtual void visit( UntypedExpr *untyped ) ;43 virtual void visit( CompoundStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 44 virtual void visit( NullStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 45 virtual void visit( ExprStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 46 virtual void visit( IfStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 47 virtual void visit( WhileStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 48 virtual void visit( ForStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 49 virtual void visit( SwitchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 50 virtual void visit( CaseStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 51 virtual void visit( ReturnStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 52 virtual void visit( TryStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 53 virtual void visit( CatchStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 54 virtual void visit( DeclStmt *stmt ) override { visit( (Statement *)stmt ); return Parent::visit( stmt ); } 55 virtual void visit( BranchStmt *branchStmt ) override; 56 virtual void visit( UntypedExpr *untyped ) override; 55 57 56 58 Label setLabelsDef( std::list< Label > &, Statement *definition ); -
src/GenPoly/Box.cc
r141b786 rb726084 64 64 65 65 /// Adds layout-generation functions to polymorphic types 66 class LayoutFunctionBuilder : public DeclMutator {66 class LayoutFunctionBuilder final : public DeclMutator { 67 67 unsigned int functionNesting; // current level of nested functions 68 68 public: 69 69 LayoutFunctionBuilder() : functionNesting( 0 ) {} 70 70 71 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ); 72 virtual Declaration *mutate( StructDecl *structDecl ); 73 virtual Declaration *mutate( UnionDecl *unionDecl ); 71 using DeclMutator::mutate; 72 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override; 73 virtual Declaration *mutate( StructDecl *structDecl ) override; 74 virtual Declaration *mutate( UnionDecl *unionDecl ) override; 74 75 }; 75 76 76 77 /// Replaces polymorphic return types with out-parameters, replaces calls to polymorphic functions with adapter calls as needed, and adds appropriate type variables to the function call 77 class Pass1 : public PolyMutator {78 class Pass1 final : public PolyMutator { 78 79 public: 79 80 Pass1(); 80 virtual Expression *mutate( ApplicationExpr *appExpr ); 81 virtual Expression *mutate( AddressExpr *addrExpr ); 82 virtual Expression *mutate( UntypedExpr *expr ); 83 virtual DeclarationWithType* mutate( FunctionDecl *functionDecl ); 84 virtual TypeDecl *mutate( TypeDecl *typeDecl ); 85 virtual Expression *mutate( CommaExpr *commaExpr ); 86 virtual Expression *mutate( ConditionalExpr *condExpr ); 87 virtual Statement * mutate( ReturnStmt *returnStmt ); 88 virtual Type *mutate( PointerType *pointerType ); 89 virtual Type * mutate( FunctionType *functionType ); 90 91 virtual void doBeginScope(); 92 virtual void doEndScope(); 81 82 using PolyMutator::mutate; 83 virtual Expression *mutate( ApplicationExpr *appExpr ) override; 84 virtual Expression *mutate( AddressExpr *addrExpr ) override; 85 virtual Expression *mutate( UntypedExpr *expr ) override; 86 virtual DeclarationWithType* mutate( FunctionDecl *functionDecl ) override; 87 virtual TypeDecl *mutate( TypeDecl *typeDecl ) override; 88 virtual Expression *mutate( CommaExpr *commaExpr ) override; 89 virtual Expression *mutate( ConditionalExpr *condExpr ) override; 90 virtual Statement * mutate( ReturnStmt *returnStmt ) override; 91 virtual Type *mutate( PointerType *pointerType ) override; 92 virtual Type * mutate( FunctionType *functionType ) override; 93 94 virtual void doBeginScope() override; 95 virtual void doEndScope() override; 93 96 private: 94 97 /// Pass the extra type parameters from polymorphic generic arguments or return types into a function application … … 135 138 /// * Moves polymorphic returns in function types to pointer-type parameters 136 139 /// * adds type size and assertion parameters to parameter lists 137 class Pass2 : public PolyMutator {140 class Pass2 final : public PolyMutator { 138 141 public: 139 142 template< typename DeclClass > 140 143 DeclClass *handleDecl( DeclClass *decl, Type *type ); 141 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ); 142 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ); 143 virtual TypeDecl *mutate( TypeDecl *typeDecl ); 144 virtual TypedefDecl *mutate( TypedefDecl *typedefDecl ); 145 virtual Type *mutate( PointerType *pointerType ); 146 virtual Type *mutate( FunctionType *funcType ); 144 145 using PolyMutator::mutate; 146 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override; 147 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override; 148 virtual TypeDecl *mutate( TypeDecl *typeDecl ) override; 149 virtual TypedefDecl *mutate( TypedefDecl *typedefDecl ) override; 150 virtual Type *mutate( PointerType *pointerType ) override; 151 virtual Type *mutate( FunctionType *funcType ) override; 147 152 148 153 private: … … 156 161 /// * Calculates polymorphic offsetof expressions from offset array 157 162 /// * Inserts dynamic calculation of polymorphic type layouts where needed 158 class PolyGenericCalculator : public PolyMutator {163 class PolyGenericCalculator final : public PolyMutator { 159 164 public: 160 165 typedef PolyMutator Parent; … … 163 168 template< typename DeclClass > 164 169 DeclClass *handleDecl( DeclClass *decl, Type *type ); 165 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) ;166 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) ;167 virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) ;168 virtual TypeDecl *mutate( TypeDecl *objectDecl ) ;169 virtual Statement *mutate( DeclStmt *declStmt ) ;170 virtual Type *mutate( PointerType *pointerType ) ;171 virtual Type *mutate( FunctionType *funcType ) ;172 virtual Expression *mutate( MemberExpr *memberExpr ) ;173 virtual Expression *mutate( SizeofExpr *sizeofExpr ) ;174 virtual Expression *mutate( AlignofExpr *alignofExpr ) ;175 virtual Expression *mutate( OffsetofExpr *offsetofExpr ) ;176 virtual Expression *mutate( OffsetPackExpr *offsetPackExpr ) ;177 178 virtual void doBeginScope() ;179 virtual void doEndScope() ;170 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override; 171 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override; 172 virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override; 173 virtual TypeDecl *mutate( TypeDecl *objectDecl ) override; 174 virtual Statement *mutate( DeclStmt *declStmt ) override; 175 virtual Type *mutate( PointerType *pointerType ) override; 176 virtual Type *mutate( FunctionType *funcType ) override; 177 virtual Expression *mutate( MemberExpr *memberExpr ) override; 178 virtual Expression *mutate( SizeofExpr *sizeofExpr ) override; 179 virtual Expression *mutate( AlignofExpr *alignofExpr ) override; 180 virtual Expression *mutate( OffsetofExpr *offsetofExpr ) override; 181 virtual Expression *mutate( OffsetPackExpr *offsetPackExpr ) override; 182 183 virtual void doBeginScope() override; 184 virtual void doEndScope() override; 180 185 181 186 private: … … 197 202 198 203 /// Replaces initialization of polymorphic values with alloca, declaration of dtype/ftype with appropriate void expression, and sizeof expressions of polymorphic types with the proper variable 199 class Pass3 : public PolyMutator {204 class Pass3 final : public PolyMutator { 200 205 public: 201 206 template< typename DeclClass > 202 207 DeclClass *handleDecl( DeclClass *decl, Type *type ); 203 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ); 204 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ); 205 virtual TypedefDecl *mutate( TypedefDecl *objectDecl ); 206 virtual TypeDecl *mutate( TypeDecl *objectDecl ); 207 virtual Type *mutate( PointerType *pointerType ); 208 virtual Type *mutate( FunctionType *funcType ); 208 209 using PolyMutator::mutate; 210 virtual DeclarationWithType *mutate( FunctionDecl *functionDecl ) override; 211 virtual ObjectDecl *mutate( ObjectDecl *objectDecl ) override; 212 virtual TypedefDecl *mutate( TypedefDecl *objectDecl ) override; 213 virtual TypeDecl *mutate( TypeDecl *objectDecl ) override; 214 virtual Type *mutate( PointerType *pointerType ) override; 215 virtual Type *mutate( FunctionType *funcType ) override; 209 216 private: 210 217 }; -
src/GenPoly/InstantiateGeneric.cc
r141b786 rb726084 147 147 148 148 /// Mutator pass that replaces concrete instantiations of generic types with actual struct declarations, scoped appropriately 149 class GenericInstantiator : public DeclMutator {149 class GenericInstantiator final : public DeclMutator { 150 150 /// Map of (generic type, parameter list) pairs to concrete type instantiations 151 151 InstantiationMap< AggregateDecl, AggregateDecl > instantiations; … … 158 158 GenericInstantiator() : DeclMutator(), instantiations(), dtypeStatics(), typeNamer("_conc_") {} 159 159 160 virtual Type* mutate( StructInstType *inst ); 161 virtual Type* mutate( UnionInstType *inst ); 162 163 virtual void doBeginScope(); 164 virtual void doEndScope(); 160 using DeclMutator::mutate; 161 virtual Type* mutate( StructInstType *inst ) override; 162 virtual Type* mutate( UnionInstType *inst ) override; 163 164 virtual void doBeginScope() override; 165 virtual void doEndScope() override; 165 166 private: 166 167 /// Wrap instantiation lookup for structs -
src/GenPoly/Specialize.cc
r141b786 rb726084 36 36 const std::list<Label> noLabels; 37 37 38 class Specialize : public PolyMutator {38 class Specialize final : public PolyMutator { 39 39 public: 40 40 Specialize( std::string paramPrefix = "_p" ); 41 41 42 virtual Expression * mutate( ApplicationExpr *applicationExpr ); 43 virtual Expression * mutate( AddressExpr *castExpr ); 44 virtual Expression * mutate( CastExpr *castExpr ); 42 using PolyMutator::mutate; 43 virtual Expression * mutate( ApplicationExpr *applicationExpr ) override; 44 virtual Expression * mutate( AddressExpr *castExpr ) override; 45 virtual Expression * mutate( CastExpr *castExpr ) override; 45 46 // virtual Expression * mutate( LogicalExpr *logicalExpr ); 46 47 // virtual Expression * mutate( ConditionalExpr *conditionalExpr ); -
src/InitTweak/FixInit.cc
r141b786 rb726084 49 49 namespace InitTweak { 50 50 namespace { 51 class InsertImplicitCalls : public GenPoly::PolyMutator {51 class InsertImplicitCalls final : public GenPoly::PolyMutator { 52 52 public: 53 53 /// wrap function application expressions as ImplicitCopyCtorExpr nodes so that it is easy to identify which … … 55 55 static void insert( std::list< Declaration * > & translationUnit ); 56 56 57 virtual Expression * mutate( ApplicationExpr * appExpr ); 57 using GenPoly::PolyMutator::mutate; 58 virtual Expression * mutate( ApplicationExpr * appExpr ) override; 58 59 }; 59 60 60 class ResolveCopyCtors : public SymTab::Indexer {61 class ResolveCopyCtors final : public SymTab::Indexer { 61 62 public: 62 63 /// generate temporary ObjectDecls for each argument and return value of each ImplicitCopyCtorExpr, … … 68 69 using Parent::visit; 69 70 70 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) ;71 virtual void visit( ImplicitCopyCtorExpr * impCpCtorExpr ) override; 71 72 virtual void visit( UniqueExpr * unqExpr ); 72 73 … … 88 89 using Parent::visit; 89 90 typedef std::set< ObjectDecl * > ObjectSet; 90 virtual void visit( CompoundStmt *compoundStmt ) ;91 virtual void visit( DeclStmt *stmt ) ;91 virtual void visit( CompoundStmt *compoundStmt ) override; 92 virtual void visit( DeclStmt *stmt ) override; 92 93 protected: 93 94 ObjectSet curVars; … … 109 110 } 110 111 111 class LabelFinder : public ObjDeclCollector {112 class LabelFinder final : public ObjDeclCollector { 112 113 public: 113 114 typedef ObjDeclCollector Parent; … … 123 124 // subclasses are added, there is only one place that the code has to be updated, rather than ensure that 124 125 // every specialized class knows about every new kind of statement that might be added. 125 virtual void visit( CompoundStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 126 virtual void visit( ExprStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 127 virtual void visit( AsmStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 128 virtual void visit( IfStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 129 virtual void visit( WhileStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 130 virtual void visit( ForStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 131 virtual void visit( SwitchStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 132 virtual void visit( CaseStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 133 virtual void visit( BranchStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 134 virtual void visit( ReturnStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 135 virtual void visit( TryStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 136 virtual void visit( CatchStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 137 virtual void visit( FinallyStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 138 virtual void visit( NullStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 139 virtual void visit( DeclStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 140 virtual void visit( ImplicitCtorDtorStmt *stmt ) { handleStmt( stmt ); return Parent::visit( stmt ); } 126 using Parent::visit; 127 virtual void visit( CompoundStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 128 virtual void visit( ExprStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 129 virtual void visit( AsmStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 130 virtual void visit( IfStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 131 virtual void visit( WhileStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 132 virtual void visit( ForStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 133 virtual void visit( SwitchStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 134 virtual void visit( CaseStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 135 virtual void visit( BranchStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 136 virtual void visit( ReturnStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 137 virtual void visit( TryStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 138 virtual void visit( CatchStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 139 virtual void visit( FinallyStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 140 virtual void visit( NullStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 141 virtual void visit( DeclStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 142 virtual void visit( ImplicitCtorDtorStmt *stmt ) override { handleStmt( stmt ); return Parent::visit( stmt ); } 141 143 }; 142 144 143 class InsertDtors : public ObjDeclCollector {145 class InsertDtors final : public ObjDeclCollector { 144 146 public: 145 147 /// insert destructor calls at the appropriate places. must happen before CtorInit nodes are removed … … 153 155 InsertDtors( LabelFinder & finder ) : labelVars( finder.vars ) {} 154 156 155 virtual void visit( ObjectDecl * objDecl ); 156 157 virtual void visit( CompoundStmt * compoundStmt ); 158 virtual void visit( ReturnStmt * returnStmt ); 159 virtual void visit( BranchStmt * stmt ); 157 using Parent::visit; 158 159 virtual void visit( ObjectDecl * objDecl ) override; 160 161 virtual void visit( CompoundStmt * compoundStmt ) override; 162 virtual void visit( ReturnStmt * returnStmt ) override; 163 virtual void visit( BranchStmt * stmt ) override; 160 164 private: 161 165 void handleGoto( BranchStmt * stmt ); … … 165 169 }; 166 170 167 class FixInit : public GenPoly::PolyMutator {171 class FixInit final : public GenPoly::PolyMutator { 168 172 public: 169 173 /// expand each object declaration to use its constructor after it is declared. 170 174 static void fixInitializers( std::list< Declaration * > &translationUnit ); 171 175 172 virtual DeclarationWithType * mutate( ObjectDecl *objDecl ); 176 using GenPoly::PolyMutator::mutate; 177 virtual DeclarationWithType * mutate( ObjectDecl *objDecl ) override; 173 178 174 179 std::list< Declaration * > staticDtorDecls; 175 180 }; 176 181 177 class FixCopyCtors : public GenPoly::PolyMutator {182 class FixCopyCtors final : public GenPoly::PolyMutator { 178 183 public: 179 184 /// expand ImplicitCopyCtorExpr nodes into the temporary declarations, copy constructors, call expression, … … 181 186 static void fixCopyCtors( std::list< Declaration * > &translationUnit ); 182 187 183 virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr ); 184 virtual Expression * mutate( UniqueExpr * unqExpr ); 188 using GenPoly::PolyMutator::mutate; 189 virtual Expression * mutate( ImplicitCopyCtorExpr * impCpCtorExpr ) override; 190 virtual Expression * mutate( UniqueExpr * unqExpr ) override; 185 191 }; 186 192 187 class GenStructMemberCalls : public SymTab::Indexer {193 class GenStructMemberCalls final : public SymTab::Indexer { 188 194 public: 189 195 typedef Indexer Parent; … … 193 199 static void generate( std::list< Declaration * > & translationUnit ); 194 200 195 virtual void visit( FunctionDecl * funcDecl ); 196 197 virtual void visit( MemberExpr * memberExpr ); 198 virtual void visit( ApplicationExpr * appExpr ); 201 using Parent::visit; 202 203 virtual void visit( FunctionDecl * funcDecl ) override; 204 205 virtual void visit( MemberExpr * memberExpr ) override; 206 virtual void visit( ApplicationExpr * appExpr ) override; 199 207 200 208 SemanticError errors; … … 214 222 // resolve UntypedExprs that are found within newly 215 223 // generated constructor/destructor calls 216 class MutatingResolver : public Mutator {224 class MutatingResolver final : public Mutator { 217 225 public: 218 226 MutatingResolver( SymTab::Indexer & indexer ) : indexer( indexer ) {} 219 227 220 virtual DeclarationWithType* mutate( ObjectDecl *objectDecl ); 221 222 virtual Expression* mutate( UntypedExpr *untypedExpr ); 223 private: 228 using Mutator::mutate; 229 virtual DeclarationWithType* mutate( ObjectDecl *objectDecl ) override; 230 virtual Expression* mutate( UntypedExpr *untypedExpr ) override; 231 232 private: 224 233 SymTab::Indexer & indexer; 225 234 }; 226 235 227 class FixCtorExprs : public GenPoly::DeclMutator {236 class FixCtorExprs final : public GenPoly::DeclMutator { 228 237 public: 229 238 /// expands ConstructorExpr nodes into comma expressions, using a temporary for the first argument 230 239 static void fix( std::list< Declaration * > & translationUnit ); 231 240 232 virtual Expression * mutate( ConstructorExpr * ctorExpr ); 241 using GenPoly::DeclMutator::mutate; 242 virtual Expression * mutate( ConstructorExpr * ctorExpr ) override; 233 243 }; 234 244 } // namespace -
src/InitTweak/GenInit.cc
r141b786 rb726084 37 37 } 38 38 39 class ReturnFixer : public GenPoly::PolyMutator {39 class ReturnFixer final : public GenPoly::PolyMutator { 40 40 public: 41 41 /// consistently allocates a temporary variable for the return value … … 46 46 ReturnFixer(); 47 47 48 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );49 50 virtual Statement * mutate( ReturnStmt * returnStmt ) ;48 using GenPoly::PolyMutator::mutate; 49 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override; 50 virtual Statement * mutate( ReturnStmt * returnStmt ) override; 51 51 52 52 protected: … … 56 56 }; 57 57 58 class CtorDtor : public GenPoly::PolyMutator {58 class CtorDtor final : public GenPoly::PolyMutator { 59 59 public: 60 60 typedef GenPoly::PolyMutator Parent; … … 66 66 static void generateCtorDtor( std::list< Declaration * > &translationUnit ); 67 67 68 virtual DeclarationWithType * mutate( ObjectDecl * ) ;69 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) ;68 virtual DeclarationWithType * mutate( ObjectDecl * ) override; 69 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override; 70 70 // should not traverse into any of these declarations to find objects 71 71 // that need to be constructed or destructed 72 virtual Declaration* mutate( StructDecl *aggregateDecl ) ;73 virtual Declaration* mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }74 virtual Declaration* mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }75 virtual Declaration* mutate( TraitDecl *aggregateDecl ) { return aggregateDecl; }76 virtual TypeDecl* mutate( TypeDecl *typeDecl ) { return typeDecl; }77 virtual Declaration* mutate( TypedefDecl *typeDecl ) { return typeDecl; }78 79 virtual Type * mutate( FunctionType *funcType ) { return funcType; }80 81 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) ;72 virtual Declaration* mutate( StructDecl *aggregateDecl ) override; 73 virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; } 74 virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; } 75 virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; } 76 virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; } 77 virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; } 78 79 virtual Type * mutate( FunctionType *funcType ) override { return funcType; } 80 81 virtual CompoundStmt * mutate( CompoundStmt * compoundStmt ) override; 82 82 83 83 private: … … 93 93 }; 94 94 95 class HoistArrayDimension : public GenPoly::DeclMutator {95 class HoistArrayDimension final : public GenPoly::DeclMutator { 96 96 public: 97 97 typedef GenPoly::DeclMutator Parent; … … 103 103 104 104 private: 105 virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ); 106 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ); 105 using Parent::mutate; 106 107 virtual DeclarationWithType * mutate( ObjectDecl * objectDecl ) override; 108 virtual DeclarationWithType * mutate( FunctionDecl *functionDecl ) override; 107 109 // should not traverse into any of these declarations to find objects 108 110 // that need to be constructed or destructed 109 virtual Declaration* mutate( StructDecl *aggregateDecl ) { return aggregateDecl; }110 virtual Declaration* mutate( UnionDecl *aggregateDecl ) { return aggregateDecl; }111 virtual Declaration* mutate( EnumDecl *aggregateDecl ) { return aggregateDecl; }112 virtual Declaration* mutate( TraitDecl *aggregateDecl ) { return aggregateDecl; }113 virtual TypeDecl* mutate( TypeDecl *typeDecl ) { return typeDecl; }114 virtual Declaration* mutate( TypedefDecl *typeDecl ) { return typeDecl; }115 116 virtual Type* mutate( FunctionType *funcType ) { return funcType; }111 virtual Declaration* mutate( StructDecl *aggregateDecl ) override { return aggregateDecl; } 112 virtual Declaration* mutate( UnionDecl *aggregateDecl ) override { return aggregateDecl; } 113 virtual Declaration* mutate( EnumDecl *aggregateDecl ) override { return aggregateDecl; } 114 virtual Declaration* mutate( TraitDecl *aggregateDecl ) override { return aggregateDecl; } 115 virtual TypeDecl* mutate( TypeDecl *typeDecl ) override { return typeDecl; } 116 virtual Declaration* mutate( TypedefDecl *typeDecl ) override { return typeDecl; } 117 118 virtual Type* mutate( FunctionType *funcType ) override { return funcType; } 117 119 118 120 void hoist( Type * type ); -
src/InitTweak/InitTweak.h
r141b786 rb726084 100 100 101 101 class ExpanderImpl; 102 typedef std::list< Expression * > IndexList; 102 103 private: 103 104 std::shared_ptr< ExpanderImpl > expander; … … 105 106 106 107 // invariant: list of size 2N (elements come in pairs [index, dimension]) 107 typedef std::list< Expression * > IndexList;108 108 IndexList indices; 109 109 }; -
src/Makefile.am
r141b786 rb726084 6 6 ## file "LICENCE" distributed with Cforall. 7 7 ## 8 ## Makefile.am -- 8 ## Makefile.am -- 9 9 ## 10 10 ## Author : Peter A. Buhr 11 11 ## Created On : Sun May 31 08:51:46 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Sat Sep 24 15:03:52201614 ## Update Count : 7 313 ## Last Modified On : Thu Oct 27 20:41:25 2016 14 ## Update Count : 75 15 15 ############################################################################### 16 16 … … 41 41 driver_cfa_cpp_SOURCES = ${SRC} 42 42 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl # yywrap 43 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -rdynamic -I${abs_top_srcdir}/src/include 43 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT 44 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic 44 45 45 46 MAINTAINERCLEANFILES += ${libdir}/${notdir ${cfa_cpplib_PROGRAMS}} -
src/Makefile.in
r141b786 rb726084 198 198 driver_cfa_cpp_DEPENDENCIES = $(am__DEPENDENCIES_1) 199 199 driver_cfa_cpp_LINK = $(CXXLD) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) \ 200 $( AM_LDFLAGS) $(LDFLAGS) -o $@200 $(driver_cfa_cpp_LDFLAGS) $(LDFLAGS) -o $@ 201 201 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) 202 202 depcomp = $(SHELL) $(top_srcdir)/automake/depcomp … … 267 267 CFA_PREFIX = @CFA_PREFIX@ 268 268 CFLAGS = @CFLAGS@ 269 CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@270 269 CPP = @CPP@ 271 270 CPPFLAGS = @CPPFLAGS@ … … 419 418 driver_cfa_cpp_SOURCES = ${SRC} 420 419 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl # yywrap 421 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -rdynamic -I${abs_top_srcdir}/src/include 420 driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT 421 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic 422 422 all: $(BUILT_SOURCES) 423 423 $(MAKE) $(AM_MAKEFLAGS) all-am -
src/Parser/ParseNode.h
r141b786 rb726084 109 109 ExpressionNode * set_extension( bool exten ) { extension = exten; return this; } 110 110 111 v oid print( std::ostream &os, int indent = 0 ) const{}111 virtual void print( std::ostream &os, int indent = 0 ) const override {} 112 112 void printOneLine( std::ostream &os, int indent = 0 ) const {} 113 113 … … 191 191 //############################################################################## 192 192 193 classTypeData;193 struct TypeData; 194 194 195 195 class DeclarationNode : public ParseNode { … … 275 275 } 276 276 277 v oid print( std::ostream &os, int indent = 0 ) const;278 v oid printList( std::ostream &os, int indent = 0 ) const;277 virtual void print( std::ostream &os, int indent = 0 ) const override; 278 virtual void printList( std::ostream &os, int indent = 0 ) const override; 279 279 280 280 Declaration * build() const; … … 349 349 virtual StatementNode * append_last_case( StatementNode * ); 350 350 351 virtual void print( std::ostream &os, int indent = 0 ) {}352 virtual void printList( std::ostream &os, int indent = 0 ) {}351 virtual void print( std::ostream &os, int indent = 0 ) const override {} 352 virtual void printList( std::ostream &os, int indent = 0 ) const override {} 353 353 private: 354 354 std::unique_ptr<Statement> stmt; -
src/ResolvExpr/AlternativeFinder.h
r141b786 rb726084 95 95 Expression *resolveInVoidContext( Expression *expr, const SymTab::Indexer &indexer, TypeEnvironment &env ); 96 96 97 void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl );98 99 97 template< typename InputIterator, typename OutputIterator > 100 98 void findMinCost( InputIterator begin, InputIterator end, OutputIterator out ) { -
src/ResolvExpr/AlternativePrinter.h
r141b786 rb726084 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // AlternativePrinter.h -- 7 // AlternativePrinter.h -- 8 8 // 9 9 // Author : Richard C. Bilson … … 23 23 24 24 namespace ResolvExpr { 25 class AlternativePrinter : public SymTab::Indexer {25 class AlternativePrinter final : public SymTab::Indexer { 26 26 public: 27 27 AlternativePrinter( std::ostream &os ); 28 virtual void visit( ExprStmt *exprStmt ); 28 29 using SymTab::Indexer::visit; 30 virtual void visit( ExprStmt *exprStmt ) override; 29 31 private: 30 32 std::ostream &os; -
src/ResolvExpr/Resolver.cc
r141b786 rb726084 33 33 34 34 namespace ResolvExpr { 35 class Resolver : public SymTab::Indexer {35 class Resolver final : public SymTab::Indexer { 36 36 public: 37 37 Resolver() : SymTab::Indexer( false ) {} 38 Resolver( const SymTab::Indexer & indexer ) : SymTab::Indexer( indexer ) {} 39 40 virtual void visit( FunctionDecl *functionDecl ) ;41 virtual void visit( ObjectDecl * objectDecl );42 virtual void visit( TypeDecl *typeDecl ) ;43 virtual void visit( EnumDecl * enumDecl ) ;44 45 virtual void visit( ArrayType * at ) ;46 virtual void visit( PointerType * at ) ;47 48 virtual void visit( ExprStmt *exprStmt ) ;49 virtual void visit( AsmExpr *asmExpr ) ;50 virtual void visit( AsmStmt *asmStmt ) ;51 virtual void visit( IfStmt *ifStmt ) ;52 virtual void visit( WhileStmt *whileStmt ) ;53 virtual void visit( ForStmt *forStmt ) ;54 virtual void visit( SwitchStmt *switchStmt ) ;55 virtual void visit( CaseStmt *caseStmt ) ;56 virtual void visit( BranchStmt *branchStmt ) ;57 virtual void visit( ReturnStmt *returnStmt ) ;58 59 virtual void visit( SingleInit *singleInit ) ;60 virtual void visit( ListInit *listInit ) ;61 virtual void visit( ConstructorInit *ctorInit ) ;38 39 using SymTab::Indexer::visit; 40 virtual void visit( FunctionDecl *functionDecl ) override; 41 virtual void visit( ObjectDecl *functionDecl ) override; 42 virtual void visit( TypeDecl *typeDecl ) override; 43 virtual void visit( EnumDecl * enumDecl ) override; 44 45 virtual void visit( ArrayType * at ) override; 46 virtual void visit( PointerType * at ) override; 47 48 virtual void visit( ExprStmt *exprStmt ) override; 49 virtual void visit( AsmExpr *asmExpr ) override; 50 virtual void visit( AsmStmt *asmStmt ) override; 51 virtual void visit( IfStmt *ifStmt ) override; 52 virtual void visit( WhileStmt *whileStmt ) override; 53 virtual void visit( ForStmt *forStmt ) override; 54 virtual void visit( SwitchStmt *switchStmt ) override; 55 virtual void visit( CaseStmt *caseStmt ) override; 56 virtual void visit( BranchStmt *branchStmt ) override; 57 virtual void visit( ReturnStmt *returnStmt ) override; 58 59 virtual void visit( SingleInit *singleInit ) override; 60 virtual void visit( ListInit *listInit ) override; 61 virtual void visit( ConstructorInit *ctorInit ) override; 62 62 private: 63 63 typedef std::list< Initializer * >::iterator InitIterator; … … 69 69 void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & ); 70 70 void fallbackInit( ConstructorInit * ctorInit ); 71 71 72 Type * functionReturn = nullptr; 72 73 Type *initContext = nullptr; … … 533 534 } 534 535 535 void resolveObject( const SymTab::Indexer & indexer, ObjectDecl * objectDecl ) {536 Resolver resolver( indexer );537 objectDecl->accept( resolver );538 }539 540 536 void Resolver::visit( ConstructorInit *ctorInit ) { 541 537 // xxx - fallback init has been removed => remove fallbackInit function and remove complexity from FixInit and remove C-init from ConstructorInit -
src/ResolvExpr/TypeMap.h
r141b786 rb726084 38 38 typedef typename std::map< std::string, Value* > ValueMap; 39 39 typedef typename ValueMap::iterator ValueMapIterator; 40 40 41 41 Value *voidValue; ///< Value for void type 42 42 Value *basicValue[BasicType::NUMBER_OF_BASIC_TYPES]; ///< Values for basic types … … 54 54 /// One scope of map rollbacks 55 55 typedef std::vector< std::pair< ValueMapIterator, Value* > > MapScope; 56 56 57 57 PointerScope pointers; ///< Value pointers to roll back to their previous state 58 58 MapScope mapNodes; ///< Value map iterators to roll back to their previous state … … 68 68 69 69 std::vector< Rollback > scopes; ///< Scope rollback information 70 70 71 71 struct Lookup : public Visitor { 72 72 Lookup( TypeMap<Value> &typeMap ) : typeMap( typeMap ), found( 0 ), toInsert( 0 ) {} … … 87 87 return found; 88 88 } 89 89 90 90 void findAndReplace( Value *&loc ) { 91 91 found = loc; … … 109 109 } 110 110 } 111 111 112 112 virtual void visit( VoidType *voidType ) { 113 113 findAndReplace( typeMap.voidValue ); 114 114 } 115 115 116 116 virtual void visit( BasicType *basicType ) { 117 117 findAndReplace( typeMap.basicValue[basicType->get_kind()] ); 118 118 } 119 119 120 120 virtual void visit( PointerType *pointerType ) { 121 121 // NOTE This is one of the places where the apporoximation of the resolver is (deliberately) poor; … … 129 129 } 130 130 } 131 131 132 132 virtual void visit( ArrayType *arrayType ) { 133 133 if ( dynamic_cast< FunctionType* >( arrayType->get_base() ) ) { … … 137 137 } 138 138 } 139 139 140 140 virtual void visit( FunctionType *functionType ) { 141 141 findAndReplace( typeMap.functionPointerValue ); 142 142 } 143 143 144 144 virtual void visit( StructInstType *structType ) { 145 145 findAndReplace( typeMap.structValue, structType->get_name() ); 146 146 } 147 147 148 148 virtual void visit( UnionInstType *unionType ) { 149 149 findAndReplace( typeMap.unionValue, unionType->get_name() ); 150 150 } 151 151 152 152 virtual void visit( EnumInstType *enumType ) { 153 153 findAndReplace( typeMap.enumValue, enumType->get_name() ); … … 157 157 Value *found; ///< Value found (NULL if none yet) 158 158 Value *toInsert; ///< Value to insert (NULL if a lookup) 159 }; // classLookup160 friend classLookup;161 159 }; // struct Lookup 160 friend struct Lookup; 161 162 162 public: 163 163 /// Starts a new scope … … 180 180 scopes.pop_back(); 181 181 } 182 182 183 183 TypeMap() : voidValue( 0 ), pointerValue( 0 ), voidPointerValue( 0 ), functionPointerValue( 0 ), structValue(), unionValue(), enumValue(), scopes() { 184 184 beginScope(); … … 199 199 return searcher.find( key ); 200 200 } 201 201 202 202 }; // class TypeMap 203 203 -
src/ResolvExpr/Unify.cc
r141b786 rb726084 73 73 const OpenVarSet &openVars; 74 74 WidenMode widenMode; 75 Type *commonType;76 75 const SymTab::Indexer &indexer; 77 76 }; -
src/SymTab/Validate.cc
r141b786 rb726084 94 94 95 95 /// Associates forward declarations of aggregates with their definitions 96 class Pass2 : public Indexer {96 class Pass2 final : public Indexer { 97 97 typedef Indexer Parent; 98 98 public: 99 99 Pass2( bool doDebug, const Indexer *indexer ); 100 100 private: 101 virtual void visit( StructInstType *structInst ); 102 virtual void visit( UnionInstType *unionInst ); 103 virtual void visit( TraitInstType *contextInst ); 104 virtual void visit( StructDecl *structDecl ); 105 virtual void visit( UnionDecl *unionDecl ); 106 virtual void visit( TypeInstType *typeInst ); 101 using Indexer::visit; 102 void visit( StructInstType *structInst ) final; 103 void visit( UnionInstType *unionInst ) final; 104 void visit( TraitInstType *contextInst ) final; 105 void visit( StructDecl *structDecl ) final; 106 void visit( UnionDecl *unionDecl ) final; 107 void visit( TypeInstType *typeInst ) final; 107 108 108 109 const Indexer *indexer; … … 182 183 }; 183 184 184 class CompoundLiteral : public GenPoly::DeclMutator {185 class CompoundLiteral final : public GenPoly::DeclMutator { 185 186 DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass; 186 187 187 virtual DeclarationWithType * mutate( ObjectDecl *objectDecl ); 188 virtual Expression *mutate( CompoundLiteralExpr *compLitExpr ); 188 using GenPoly::DeclMutator::mutate; 189 DeclarationWithType * mutate( ObjectDecl *objectDecl ) final; 190 Expression *mutate( CompoundLiteralExpr *compLitExpr ) final; 189 191 }; 190 192 … … 652 654 void EliminateTypedef::addImplicitTypedef( AggDecl * aggDecl ) { 653 655 if ( typedefNames.count( aggDecl->get_name() ) == 0 ) { 654 Type *type ;656 Type *type = nullptr; 655 657 if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( aggDecl ) ) { 656 658 type = new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ); -
src/driver/Makefile.am
r141b786 rb726084 11 11 ## Created On : Sun May 31 08:49:31 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Thu Jan 28 09:04:40201614 ## Update Count : 713 ## Last Modified On : Fri Oct 28 13:46:06 2016 14 ## Update Count : 10 15 15 ############################################################################### 16 16 … … 26 26 cc1_SOURCES = cc1.cc 27 27 28 cfa.cc : ${abs_top_srcdir}/version29 @true30 31 28 MAINTAINERCLEANFILES = @CFA_PREFIX@/bin/${bin_PROGRAMS} @CFA_PREFIX@/lib/${cc1lib_PROGRAMS} -
src/driver/Makefile.in
r141b786 rb726084 100 100 CFA_PREFIX = @CFA_PREFIX@ 101 101 CFLAGS = @CFLAGS@ 102 CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@103 102 CPP = @CPP@ 104 103 CPPFLAGS = @CPPFLAGS@ … … 543 542 544 543 545 cfa.cc : ${abs_top_srcdir}/version546 @true547 548 544 # Tell versions [3.59,3.63) of GNU make to not export all variables. 549 545 # Otherwise a system limit (for SysV at least) may be exceeded. -
src/driver/cfa.cc
r141b786 rb726084 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Oct 25 21:29:48201613 // Update Count : 15 212 // Last Modified On : Thu Oct 27 22:19:37 2016 13 // Update Count : 154 14 14 // 15 15 … … 50 50 51 51 52 #define str(s) #s 53 52 54 int main( int argc, char *argv[] ) { 53 string Version( CFA_VERSION_LONG ); // current version number from CONFIG54 string Major( to_string( CFA_VERSION_MAJOR ) ), Minor( to_string( CFA_VERSION_MINOR ) ), Patch( to_string( CFA_VERSION_PATCH ) );55 string Version( CFA_VERSION_LONG ); // current version number from CONFIG 56 string Major( str( CFA_VERSION_MAJOR ) ), Minor( str( CFA_VERSION_MINOR ) ), Patch( str( CFA_VERSION_PATCH ) ); 55 57 56 58 string installincdir( CFA_INCDIR ); // fixed location of include files -
src/examples/Makefile.in
r141b786 rb726084 111 111 # applies to both programs 112 112 CFLAGS = -g -Wall -Wno-unused-function # TEMPORARY: does not build with -O2 113 CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@114 113 CPP = @CPP@ 115 114 CPPFLAGS = @CPPFLAGS@ -
src/libcfa/Makefile.in
r141b786 rb726084 137 137 CFA_PREFIX = @CFA_PREFIX@ 138 138 CFLAGS = -quiet -no-include-stdhdr -g -Wall -Wno-unused-function @CFA_FLAGS@ -B${abs_top_srcdir}/src/driver -XCFA -t # TEMPORARY: does not build with -O2 139 CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@140 139 CPP = @CPP@ 141 140 CPPFLAGS = @CPPFLAGS@ -
src/main.cc
r141b786 rb726084 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Aug 29 17:34:39201613 // Update Count : 4 2612 // Last Modified On : Sun Oct 30 10:11:38 2016 13 // Update Count : 435 14 14 // 15 15 … … 18 18 #include <signal.h> // signal 19 19 #include <getopt.h> // getopt 20 #include <execinfo.h> // backtrace, backtrace_symbols _fd20 #include <execinfo.h> // backtrace, backtrace_symbols 21 21 #include <cxxabi.h> // __cxa_demangle 22 #include <cstring> // index 22 23 23 24 using namespace std; … … 76 77 static void dump( list< Declaration * > & translationUnit, ostream & out = cout ); 77 78 78 void backtrace( int start ) {// skip first N stack frames79 static void backtrace( int start ) { // skip first N stack frames 79 80 enum { Frames = 50 }; 80 81 void * array[Frames]; 81 int size = backtrace( array, Frames ); 82 char ** messages = backtrace_symbols( array, size ); 82 int size = ::backtrace( array, Frames ); 83 char ** messages = ::backtrace_symbols( array, size ); // does not demangle names 84 85 *index( messages[0], '(' ) = '\0'; // find executable name 86 cerr << "Stack back trace for: " << messages[0] << endl; 83 87 84 88 // skip last 2 stack frames after main … … 86 90 char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr; 87 91 for ( char *p = messages[i]; *p; ++p ) { // find parantheses and +offset 88 if ( *p == '(') {92 if ( *p == '(' ) { 89 93 mangled_name = p; 90 } else if ( *p == '+') {94 } else if ( *p == '+' ) { 91 95 offset_begin = p; 92 } else if ( *p == ')') {96 } else if ( *p == ')' ) { 93 97 offset_end = p; 94 98 break; … … 99 103 int frameNo = i - start; 100 104 if ( mangled_name && offset_begin && offset_end && mangled_name < offset_begin ) { 101 *mangled_name++ = '\0'; 105 *mangled_name++ = '\0'; // delimit strings 102 106 *offset_begin++ = '\0'; 103 107 *offset_end++ = '\0'; 104 108 105 int status , frameNo = i - start;109 int status; 106 110 char * real_name = __cxxabiv1::__cxa_demangle( mangled_name, 0, 0, &status ); 111 // bug in __cxa_demangle for single-character lower-case non-mangled names 107 112 if ( status == 0 ) { // demangling successful ? 108 113 cerr << "(" << frameNo << ") " << messages[i] << " : " 109 114 << real_name << "+" << offset_begin << offset_end << endl; 110 111 115 } else { // otherwise, output mangled name 112 116 cerr << "(" << frameNo << ") " << messages[i] << " : " 113 << mangled_name << " +" << offset_begin << offset_end << endl;117 << mangled_name << "(/*unknown*/)+" << offset_begin << offset_end << endl; 114 118 } // if 119 115 120 free( real_name ); 116 121 } else { // otherwise, print the whole line … … 125 130 cerr << "*CFA runtime error* program cfa-cpp terminated with " 126 131 << (sig_num == SIGSEGV ? "segment fault" : "bus error") 127 << " backtrace:" << endl;132 << "." << endl; 128 133 backtrace( 2 ); // skip first 2 stack frames 129 134 exit( EXIT_FAILURE ); -
src/tests/Makefile.in
r141b786 rb726084 121 121 # applies to both programs 122 122 CFLAGS = -g -Wall -Wno-unused-function @CFA_FLAGS@ # TEMPORARY: does not build with -O2 123 CONFIG_STATUS_DEPENDENCIES = @CONFIG_STATUS_DEPENDENCIES@124 123 CPP = @CPP@ 125 124 CPPFLAGS = @CPPFLAGS@
Note:
See TracChangeset
for help on using the changeset viewer.