Changeset b826e6b for src/CodeGen
- Timestamp:
- Jul 19, 2017, 11:49:33 AM (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, stuck-waitfor-destruct, with_gc
- Children:
- 9cc0472
- Parents:
- fea3faa (diff), a57cb58 (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/CodeGen
- Files:
-
- 10 edited
-
CodeGenerator.cc (modified) (4 diffs)
-
CodeGenerator.h (modified) (3 diffs)
-
FixMain.cc (modified) (1 diff)
-
FixNames.cc (modified) (6 diffs)
-
FixNames.h (modified) (1 diff)
-
GenType.cc (modified) (1 diff)
-
GenType.h (modified) (1 diff)
-
Generate.cc (modified) (1 diff)
-
Generate.h (modified) (1 diff)
-
OperatorTable.cc (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
rfea3faa rb826e6b 14 14 // 15 15 16 #include <algorithm> 17 #include <iostream> 18 #include <cassert> 19 #include <list> 20 21 #include "Parser/ParseNode.h" 22 23 #include "SynTree/Declaration.h" 24 #include "SynTree/Expression.h" 25 #include "SynTree/Initializer.h" 26 #include "SynTree/Statement.h" 27 #include "SynTree/Type.h" 28 #include "SynTree/Attribute.h" 29 30 #include "Common/utility.h" 31 #include "Common/UnimplementedError.h" 16 #include <cassert> // for assert, assertf 17 #include <list> // for _List_iterator, list, list<>::it... 32 18 33 19 #include "CodeGenerator.h" 34 #include "OperatorTable.h" 35 #include "GenType.h" 36 37 #include "InitTweak/InitTweak.h" 20 #include "Common/SemanticError.h" // for SemanticError 21 #include "Common/UniqueName.h" // for UniqueName 22 #include "Common/utility.h" // for CodeLocation, toString 23 #include "GenType.h" // for genType 24 #include "InitTweak/InitTweak.h" // for getPointerBase 25 #include "OperatorTable.h" // for OperatorInfo, operatorLookup 26 #include "Parser/LinkageSpec.h" // for Spec, Intrinsic 27 #include "SynTree/Attribute.h" // for Attribute 28 #include "SynTree/BaseSyntaxNode.h" // for BaseSyntaxNode 29 #include "SynTree/Constant.h" // for Constant 30 #include "SynTree/Declaration.h" // for DeclarationWithType, TypeDecl 31 #include "SynTree/Expression.h" // for Expression, UntypedExpr, Applica... 32 #include "SynTree/Initializer.h" // for Initializer, ListInit, Designation 33 #include "SynTree/Label.h" // for Label, operator<< 34 #include "SynTree/Statement.h" // for Statement, AsmStmt, BranchStmt 35 #include "SynTree/Type.h" // for Type, Type::StorageClasses, Func... 38 36 39 37 using namespace std; … … 288 286 } 289 287 290 void CodeGenerator:: printDesignators( std::list< Expression * > & designators) {291 typedef std::list< Expression * > DesignatorList;288 void CodeGenerator::visit( Designation * designation ) { 289 std::list< Expression * > designators = designation->get_designators(); 292 290 if ( designators.size() == 0 ) return; 293 for ( DesignatorList::iterator iter = designators.begin(); iter != designators.end(); ++iter) {294 if ( dynamic_cast< NameExpr * >( *iter) ) {295 // if expression is a name, then initializing aggregate member291 for ( Expression * des : designators ) { 292 if ( dynamic_cast< NameExpr * >( des ) || dynamic_cast< VariableExpr * >( des ) ) { 293 // if expression is a NameExpr or VariableExpr, then initializing aggregate member 296 294 output << "."; 297 (*iter)->accept( *this );295 des->accept( *this ); 298 296 } else { 299 // if not a simple name, it has to be a constant expression, i.e. an array designator297 // otherwise, it has to be a ConstantExpr or CastExpr, initializing array eleemnt 300 298 output << "["; 301 (*iter)->accept( *this );299 des->accept( *this ); 302 300 output << "]"; 303 301 } // if … … 307 305 308 306 void CodeGenerator::visit( SingleInit * init ) { 309 printDesignators( init->get_designators() );310 307 init->get_value()->accept( *this ); 311 308 } 312 309 313 310 void CodeGenerator::visit( ListInit * init ) { 314 printDesignators( init->get_designators() ); 311 auto initBegin = init->begin(); 312 auto initEnd = init->end(); 313 auto desigBegin = init->get_designations().begin(); 314 auto desigEnd = init->get_designations().end(); 315 315 316 output << "{ "; 316 genCommaList( init->begin(), init->end() ); 317 for ( ; initBegin != initEnd && desigBegin != desigEnd; ) { 318 (*desigBegin)->accept( *this ); 319 (*initBegin)->accept( *this ); 320 ++initBegin, ++desigBegin; 321 if ( initBegin != initEnd ) { 322 output << ", "; 323 } 324 } 317 325 output << " }"; 326 assertf( initBegin == initEnd && desigBegin == desigEnd, "Initializers and designators not the same length. %s", toString( init ).c_str() ); 318 327 } 319 328 … … 716 725 717 726 void CodeGenerator::visit( TypeExpr * typeExpr ) { 718 assertf( ! genC, "TypeExpr should not reach code generation." ); 719 output<< genType( typeExpr->get_type(), "", pretty, genC ); 727 // if ( genC ) std::cerr << "typeexpr still exists: " << typeExpr << std::endl; 728 // assertf( ! genC, "TypeExpr should not reach code generation." ); 729 if ( ! genC ) { 730 output<< genType( typeExpr->get_type(), "", pretty, genC ); 731 } 720 732 } 721 733 -
src/CodeGen/CodeGenerator.h
rfea3faa rb826e6b 17 17 #define CODEGENV_H 18 18 19 #include <list> 19 #include <list> // for list 20 #include <ostream> // for ostream, operator<< 21 #include <string> // for string 20 22 21 #include "SynTree/Declaration.h" 22 #include "SynTree/SynTree.h" 23 #include "SynTree/Visitor.h" 24 25 #include "SymTab/Indexer.h" 26 27 #include "Common/utility.h" 23 #include "SynTree/Declaration.h" // for DeclarationWithType (ptr only), Fun... 24 #include "SynTree/Visitor.h" // for Visitor 25 #include "SynTree/SynTree.h" // for Visitor Nodes 28 26 29 27 namespace CodeGen { … … 47 45 48 46 //*** Initializer 47 virtual void visit( Designation * ); 49 48 virtual void visit( SingleInit * ); 50 49 virtual void visit( ListInit * ); … … 137 136 bool lineMarks = false; 138 137 139 void printDesignators( std::list< Expression * > & );140 138 void handleStorageClass( DeclarationWithType *decl ); 141 139 void handleAggregate( AggregateDecl *aggDecl, const std::string & kind ); -
src/CodeGen/FixMain.cc
rfea3faa rb826e6b 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // FixMain.cc -- 7 // FixMain.cc -- 8 8 // 9 9 // Author : Thierry Delisle 10 10 // Created On : Thr Jan 12 14:11:09 2017 11 // Last Modified By : 12 // Last Modified On : 11 // Last Modified By : 12 // Last Modified On : 13 13 // Update Count : 0 14 14 // 15 15 16 16 17 #include "FixMain.h" 17 #include "FixMain.h" 18 18 19 #include <fstream> 20 #include <iostream> 19 #include <cassert> // for assert, assertf 20 #include <fstream> // for operator<<, basic_ostream::operator<< 21 #include <list> // for list 22 #include <string> // for operator<< 21 23 22 #include "Common/SemanticError.h" 23 #include "SynTree/Declaration.h" 24 #include "Common/SemanticError.h" // for SemanticError 25 #include "SynTree/Declaration.h" // for FunctionDecl, operator<< 26 #include "SynTree/Type.h" // for FunctionType 24 27 25 28 namespace CodeGen { 26 29 bool FixMain::replace_main = false; 27 30 std::unique_ptr<FunctionDecl> FixMain::main_signature = nullptr; 28 29 void FixMain::registerMain(FunctionDecl* functionDecl) 31 32 void FixMain::registerMain(FunctionDecl* functionDecl) 30 33 { 31 if(main_signature) { 32 throw SemanticError("Multiple definition of main routine\n", functionDecl); 34 if(main_signature) { 35 throw SemanticError("Multiple definition of main routine\n", functionDecl); 33 36 } 34 37 main_signature.reset( functionDecl->clone() ); -
src/CodeGen/FixNames.cc
rfea3faa rb826e6b 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Wed Jun 2 1 14:22:59201713 // Update Count : 1911 // Last Modified By : Andrew Beach 12 // Last Modified On : Wed Jun 28 15:26:00 2017 13 // Update Count : 20 14 14 // 15 15 16 #include <memory>16 #include "FixNames.h" 17 17 18 #include "FixNames.h" 19 #include "SynTree/Declaration.h" 20 #include "SynTree/Expression.h" 21 #include "SynTree/Visitor.h" 22 #include "SymTab/Mangler.h" 23 #include "OperatorTable.h" 24 #include "FixMain.h" 18 #include <memory> // for unique_ptr 19 #include <string> // for string, operator!=, operator== 20 21 #include "Common/SemanticError.h" // for SemanticError 22 #include "FixMain.h" // for FixMain 23 #include "Parser/LinkageSpec.h" // for Cforall, isMangled 24 #include "SymTab/Mangler.h" // for Mangler 25 #include "SynTree/Constant.h" // for Constant 26 #include "SynTree/Declaration.h" // for FunctionDecl, ObjectDecl, Declarat... 27 #include "SynTree/Expression.h" // for ConstantExpr 28 #include "SynTree/Label.h" // for Label, noLabels 29 #include "SynTree/Statement.h" // for ReturnStmt, CompoundStmt 30 #include "SynTree/Type.h" // for Type, BasicType, Type::Qualifiers 31 #include "SynTree/Visitor.h" // for Visitor, acceptAll 25 32 26 33 namespace CodeGen { … … 42 49 main_type = new FunctionType( Type::Qualifiers(), true ), nullptr ) 43 50 }; 44 main_type->get_returnVals().push_back( 51 main_type->get_returnVals().push_back( 45 52 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 46 53 ); … … 52 59 std::string mangle_main_args() { 53 60 FunctionType* main_type; 54 std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( "main", Type::StorageClasses(), LinkageSpec::Cforall, 61 std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( "main", Type::StorageClasses(), LinkageSpec::Cforall, 55 62 main_type = new FunctionType( Type::Qualifiers(), false ), nullptr ) 56 63 }; 57 main_type->get_returnVals().push_back( 64 main_type->get_returnVals().push_back( 58 65 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 59 66 ); 60 67 61 mainDecl->get_functionType()->get_parameters().push_back( 68 mainDecl->get_functionType()->get_parameters().push_back( 62 69 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr ) 63 70 ); 64 71 65 mainDecl->get_functionType()->get_parameters().push_back( 66 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, 67 new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Char ) ) ), 72 mainDecl->get_functionType()->get_parameters().push_back( 73 new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, 74 new PointerType( Type::Qualifiers(), new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::Char ) ) ), 68 75 nullptr ) 69 76 ); … … 75 82 76 83 bool is_main(const std::string& name) { 77 static std::string mains[] = { 78 mangle_main(), 84 static std::string mains[] = { 85 mangle_main(), 79 86 mangle_main_args() 80 87 }; … … 93 100 void FixNames::fixDWT( DeclarationWithType *dwt ) { 94 101 if ( dwt->get_name() != "" ) { 95 if ( LinkageSpec::is Decoratable( dwt->get_linkage() ) ) {102 if ( LinkageSpec::isMangled( dwt->get_linkage() ) ) { 96 103 dwt->set_mangleName( SymTab::Mangler::mangle( dwt ) ); 97 104 dwt->set_scopeLevel( scopeLevel ); … … 112 119 int nargs = functionDecl->get_functionType()->get_parameters().size(); 113 120 if( !(nargs == 0 || nargs == 2 || nargs == 3) ) { 114 throw SemanticError("Main expected to have 0, 2 or 3 arguments\n", functionDecl); 121 throw SemanticError("Main expected to have 0, 2 or 3 arguments\n", functionDecl); 115 122 } 116 123 functionDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new ConstantExpr( Constant::from_int( 0 ) ) ) ); -
src/CodeGen/FixNames.h
rfea3faa rb826e6b 17 17 #define FIXNAMES_H 18 18 19 #include "SynTree/SynTree.h" 19 #include <list> // for list 20 21 class Declaration; 20 22 21 23 namespace CodeGen { -
src/CodeGen/GenType.cc
rfea3faa rb826e6b 14 14 // 15 15 16 #include <sstream> 17 #include <cassert> 18 16 #include <cassert> // for assert, assertf 17 #include <list> // for _List_iterator, _List_const_iterator 18 #include <sstream> // for operator<<, ostringstream, basic_os... 19 20 #include "CodeGenerator.h" // for CodeGenerator 19 21 #include "GenType.h" 20 #include "CodeGenerator.h" 21 22 #include "SynTree/Declaration.h" 23 #include "SynTree/Expression.h" 24 #include "SynTree/Type.h" 25 #include "SynTree/Visitor.h" 22 #include "SynTree/Declaration.h" // for DeclarationWithType 23 #include "SynTree/Expression.h" // for Expression 24 #include "SynTree/Type.h" // for PointerType, Type, FunctionType 25 #include "SynTree/Visitor.h" // for Visitor 26 26 27 27 namespace CodeGen { -
src/CodeGen/GenType.h
rfea3faa rb826e6b 17 17 #define _GENTYPE_H 18 18 19 #include <string> 20 #include "SynTree/SynTree.h" 19 #include <string> // for string 20 21 class Type; 21 22 22 23 namespace CodeGen { -
src/CodeGen/Generate.cc
rfea3faa rb826e6b 14 14 // 15 15 16 #include <algorithm> 17 #include <iostream> 18 #include <cassert> 19 #include <list> 16 #include <iostream> // for ostream, endl, operator<< 17 #include <list> // for list 18 #include <string> // for operator<< 20 19 20 #include "CodeGenerator.h" // for CodeGenerator, doSemicolon, oper... 21 #include "GenType.h" // for genPrettyType 21 22 #include "Generate.h" 22 #include "SynTree/Declaration.h" 23 #include "CodeGenerator.h" 24 #include "GenType.h" 25 #include "SynTree/SynTree.h" 26 #include "SynTree/Type.h" 27 #include "SynTree/BaseSyntaxNode.h" 28 // #include "Tuples/Tuples.h" 23 #include "Parser/LinkageSpec.h" // for isBuiltin, isGeneratable 24 #include "SynTree/BaseSyntaxNode.h" // for BaseSyntaxNode 25 #include "SynTree/Declaration.h" // for Declaration 26 #include "SynTree/Type.h" // for Type 29 27 30 28 using namespace std; -
src/CodeGen/Generate.h
rfea3faa rb826e6b 17 17 #define GENERATE_H 18 18 19 #include < list>20 #include < iostream>19 #include <iostream> // for ostream 20 #include <list> // for list 21 21 22 #include "SynTree/SynTree.h" 22 class BaseSyntaxNode; 23 class Declaration; 23 24 24 25 namespace CodeGen { -
src/CodeGen/OperatorTable.cc
rfea3faa rb826e6b 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 13 14:33:05 201613 // Update Count : 1 012 // Last Modified On : Sat Jul 15 17:12:22 2017 13 // Update Count : 15 14 14 // 15 15 16 #include <map> 16 #include <map> // for map, _Rb_tree_const_iterator, map<>::const_iterator 17 #include <utility> // for pair 18 17 19 #include "OperatorTable.h" 18 20 … … 33 35 { "++?", "++", "_operator_preincr", OT_PREFIXASSIGN }, 34 36 { "--?", "--", "_operator_predecr", OT_PREFIXASSIGN }, 37 { "?\\?", "\\", "_operator_exponential", OT_INFIX }, 35 38 { "?*?", "*", "_operator_multiply", OT_INFIX }, 36 39 { "?/?", "/", "_operator_divide", OT_INFIX }, … … 50 53 { "?|?", "|", "_operator_bitor", OT_INFIX }, 51 54 { "?=?", "=", "_operator_assign", OT_INFIXASSIGN }, 55 { "?\\=?", "\\=", "_operator_expassign", OT_INFIXASSIGN }, 52 56 { "?*=?", "*=", "_operator_multassign", OT_INFIXASSIGN }, 53 57 { "?/=?", "/=", "_operator_divassign", OT_INFIXASSIGN },
Note:
See TracChangeset
for help on using the changeset viewer.