Changeset 03e5d14
- Timestamp:
- May 6, 2016, 3:45:23 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 9e2c1f0, af18713, fac84be
- Parents:
- 37024fd
- Location:
- src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r37024fd r03e5d14 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri May 06 1 4:57:16201612 // Last Modified On : Fri May 06 15:40:35 2016 13 13 // Update Count : 243 14 14 // … … 76 76 void CodeGenerator::visit( FunctionDecl *functionDecl ) { 77 77 // generalize this 78 switch ( functionDecl->get_attribute() ) { 79 case FunctionDecl::Constructor: 80 output << "__attribute__ ((constructor)) "; 78 FunctionDecl::Attribute attr = functionDecl->get_attribute(); 79 switch ( attr.type ) { 80 case FunctionDecl::Attribute::Constructor: 81 output << "__attribute__ ((constructor"; 82 if ( attr.priority != FunctionDecl::Attribute::Default ) { 83 output << "(" << attr.priority << ")"; 84 } 85 output << ")) "; 81 86 break; 82 case FunctionDecl::Destructor: 83 output << "__attribute__ ((destructor)) "; 87 case FunctionDecl::Attribute::Destructor: 88 output << "__attribute__ ((destructor"; 89 if ( attr.priority != FunctionDecl::Attribute::Default ) { 90 output << "(" << attr.priority << ")"; 91 } 92 output << ")) "; 84 93 break; 85 94 default: -
src/InitTweak/FixGlobalInit.cc
r37024fd r03e5d14 10 10 // Created On : Mon May 04 15:14:56 2016 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri May 06 1 4:59:26201612 // Last Modified On : Fri May 06 15:40:48 2016 13 13 // Update Count : 2 14 14 // … … 30 30 class GlobalFixer : public Visitor { 31 31 public: 32 GlobalFixer( const std::string & name );32 GlobalFixer( const std::string & name, bool inLibrary ); 33 33 34 34 virtual void visit( ObjectDecl *objDecl ); … … 87 87 } 88 88 89 void fixGlobalInit( std::list< Declaration * > & translationUnit, const std::string & name ) {90 GlobalFixer fixer( name );89 void fixGlobalInit( std::list< Declaration * > & translationUnit, const std::string & name, bool inLibrary ) { 90 GlobalFixer fixer( name, inLibrary ); 91 91 acceptAll( translationUnit, fixer ); 92 92 translationUnit.push_back( fixer.initFunction ); … … 102 102 } 103 103 104 GlobalFixer::GlobalFixer( const std::string & name ) : tempNamer( "_global_init" ) {105 initFunction = new FunctionDecl( initName( name ), DeclarationNode::Static, LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( noLabels ), false, false, FunctionDecl:: Constructor);104 GlobalFixer::GlobalFixer( const std::string & name, bool inLibrary ) : tempNamer( "_global_init" ) { 105 initFunction = new FunctionDecl( initName( name ), DeclarationNode::Static, LinkageSpec::C, new FunctionType( Type::Qualifiers(), false ), new CompoundStmt( noLabels ), false, false, FunctionDecl::Attribute( FunctionDecl::Attribute::Constructor, inLibrary ? FunctionDecl::Attribute::High : FunctionDecl::Attribute::Default ) ); 106 106 } 107 107 -
src/InitTweak/FixGlobalInit.h
r37024fd r03e5d14 10 10 // Created On : Mon May 04 15:14:56 2016 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Wed May 04 16:35:37201612 // Last Modified On : Fri May 06 15:29:13 2016 13 13 // Update Count : 2 14 14 // … … 24 24 25 25 namespace InitTweak { 26 /// Moves global initialization into an _init function that is unique to the translation unit 27 void fixGlobalInit( std::list< Declaration * > & translationUnit, const std::string & name ); 26 /// Moves global initialization into an _init function that is unique to the translation unit. 27 /// Sets the priority of the initialization function depending on whether the initialization 28 /// function is for library code. 29 void fixGlobalInit( std::list< Declaration * > & translationUnit, const std::string & name, bool inLibrary ); 28 30 29 31 /// Apply transformations to a file name to get a valid C identifier which will be used as -
src/SynTree/Declaration.h
r37024fd r03e5d14 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri May 06 1 1:16:45201612 // Last Modified On : Fri May 06 15:39:02 2016 13 13 // Update Count : 33 14 14 // … … 107 107 public: 108 108 // temporary - merge this into general GCC attributes 109 enum Attribute { 110 NoAttribute, Constructor, Destructor, 109 struct Attribute { 110 enum Type { 111 NoAttribute, Constructor, Destructor, 112 } type; 113 enum Priority { 114 // priorities 0-100 are reserved by gcc, so it's okay to use 100 an exceptional case 115 Default = 100, High, 116 } priority; 117 Attribute(Type t = NoAttribute, Priority p = Default) : type(t), priority(p) {}; 111 118 }; 112 119 113 FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, FunctionType *type, CompoundStmt *statements, bool isInline, bool isNoreturn, Attribute attribute = NoAttribute);120 FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Type linkage, FunctionType *type, CompoundStmt *statements, bool isInline, bool isNoreturn, Attribute attribute = Attribute() ); 114 121 FunctionDecl( const FunctionDecl &other ); 115 122 virtual ~FunctionDecl(); -
src/SynTree/FunctionDecl.cc
r37024fd r03e5d14 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri May 06 1 1:35:09201612 // Last Modified On : Fri May 06 15:41:05 2016 13 13 // Update Count : 19 14 14 // … … 65 65 os << "_Noreturn "; 66 66 } // if 67 switch ( attribute ) {68 case Constructor:67 switch ( attribute.type ) { 68 case Attribute::Constructor: 69 69 os << "Global Constructor "; 70 70 break; 71 case Destructor:71 case Attribute::Destructor: 72 72 os << "Global Destructor "; 73 73 break; 74 74 default: 75 75 break; 76 } 77 if ( attribute.priority != Attribute::Default ) { 78 os << "with priority " << attribute.priority << " "; 76 79 } 77 80 if ( get_storageClass() != DeclarationNode::NoStorageClass ) { … … 114 117 os << "_Noreturn "; 115 118 } // if 116 switch ( attribute ) {117 case Constructor:119 switch ( attribute.type ) { 120 case Attribute::Constructor: 118 121 os << " Global Constructor "; 119 122 break; 120 case Destructor:123 case Attribute::Destructor: 121 124 os << " Global Destructor "; 122 125 break; 123 126 default: 124 127 break; 128 } 129 if ( attribute.priority != Attribute::Default ) { 130 os << "with priority " << attribute.priority << " "; 125 131 } 126 132 if ( get_storageClass() != DeclarationNode::NoStorageClass ) { -
src/main.cc
r37024fd r03e5d14 10 10 // Created On : Fri May 15 23:12:02 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Fri May 06 1 4:56:40201612 // Last Modified On : Fri May 06 15:29:42 2016 13 13 // Update Count : 203 14 14 // … … 261 261 CodeGen::fixNames( translationUnit ); 262 262 OPTPRINT( "fixGlobalInit" ); 263 InitTweak::fixGlobalInit( translationUnit, filename );263 InitTweak::fixGlobalInit( translationUnit, filename, libcfap || treep ); 264 264 OPTPRINT( "tweak" ) 265 265 InitTweak::tweak( translationUnit );
Note: See TracChangeset
for help on using the changeset viewer.