- Timestamp:
- Apr 11, 2016, 11:51:07 AM (9 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, string, with_gc
- Children:
- 37f0da8
- Parents:
- 3aba311 (diff), e55ca05 (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:
-
- 7 added
- 1 deleted
- 34 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
src/CodeGen/CodeGenerator.cc
r3aba311 r37218fc 455 455 456 456 void CodeGenerator::visit( UntypedOffsetofExpr *offsetofExpr ) { 457 assert( false );457 assert( false && "UntypedOffsetofExpr should not reach code generation" ); 458 458 } 459 459 … … 464 464 output << ", " << mangleName( offsetofExpr->get_member() ); 465 465 output << ")"; 466 } 467 468 void CodeGenerator::visit( OffsetPackExpr *offsetPackExpr ) { 469 assert( false && "OffsetPackExpr should not reach code generation" ); 466 470 } 467 471 -
src/CodeGen/CodeGenerator.h
r3aba311 r37218fc 65 65 virtual void visit( UntypedOffsetofExpr *offsetofExpr ); 66 66 virtual void visit( OffsetofExpr *offsetofExpr ); 67 virtual void visit( OffsetPackExpr *offsetPackExpr ); 67 68 virtual void visit( LogicalExpr *logicalExpr ); 68 69 virtual void visit( ConditionalExpr *conditionalExpr ); -
src/GenPoly/Box.cc
r3aba311 r37218fc 30 30 #include "FindFunction.h" 31 31 #include "ScopedMap.h" 32 #include "ScopedSet.h" 32 33 #include "ScrubTyVars.h" 33 34 … … 62 63 FunctionType *makeAdapterType( FunctionType *adaptee, const TyVarMap &tyVars ); 63 64 64 /// Key for a unique concrete type; generic base type paired with type parameter list 65 struct ConcreteType { 66 ConcreteType() : base(NULL), params() {} 67 68 ConcreteType(AggregateDecl *_base, const std::list< Type* >& _params) : base(_base), params() { cloneAll(_params, params); } 69 70 ConcreteType(const ConcreteType& that) : base(that.base), params() { cloneAll(that.params, params); } 65 /// Abstracts type equality for a list of parameter types 66 struct TypeList { 67 TypeList() : params() {} 68 TypeList( const std::list< Type* > &_params ) : params() { cloneAll(_params, params); } 69 TypeList( std::list< Type* > &&_params ) : params( _params ) {} 70 71 TypeList( const TypeList &that ) : params() { cloneAll(that.params, params); } 72 TypeList( TypeList &&that ) : params( std::move( that.params ) ) {} 71 73 72 74 /// Extracts types from a list of TypeExpr* 73 ConcreteType(AggregateDecl *_base, const std::list< TypeExpr* >& _params) : base(_base),params() {75 TypeList( const std::list< TypeExpr* >& _params ) : params() { 74 76 for ( std::list< TypeExpr* >::const_iterator param = _params.begin(); param != _params.end(); ++param ) { 75 77 params.push_back( (*param)->get_type()->clone() ); … … 77 79 } 78 80 79 ConcreteType& operator= (const ConcreteType& that) {81 TypeList& operator= ( const TypeList &that ) { 80 82 deleteAll( params ); 83 81 84 params.clear(); 82 83 base = that.base;84 85 cloneAll( that.params, params ); 85 86 … … 87 88 } 88 89 89 ~ConcreteType() { deleteAll( params ); } 90 91 bool operator== (const ConcreteType& that) const { 92 if ( base != that.base ) return false; 90 TypeList& operator= ( TypeList &&that ) { 91 deleteAll( params ); 92 93 params = std::move( that.params ); 94 95 return *this; 96 } 97 98 ~TypeList() { deleteAll( params ); } 99 100 bool operator== ( const TypeList& that ) const { 101 if ( params.size() != that.params.size() ) return false; 93 102 94 103 SymTab::Indexer dummy; 95 if ( params.size() != that.params.size() ) return false;96 104 for ( std::list< Type* >::const_iterator it = params.begin(), jt = that.params.begin(); it != params.end(); ++it, ++jt ) { 97 105 if ( ! ResolvExpr::typesCompatible( *it, *jt, dummy ) ) return false; … … 100 108 } 101 109 102 AggregateDecl *base; ///< Base generic type103 110 std::list< Type* > params; ///< Instantiation parameters 104 111 }; 105 112 106 /// Maps a concrete typeto the some value, accounting for scope107 template< typename Value >113 /// Maps a key and a TypeList to the some value, accounting for scope 114 template< typename Key, typename Value > 108 115 class InstantiationMap { 109 /// Information about a specific instantiation of a generic type 110 struct Instantiation { 111 ConcreteType key; ///< Instantiation parameters for this type 112 Value *value; ///< Value for this instantiation 113 114 Instantiation() : key(), value(0) {} 115 Instantiation(const ConcreteType &_key, Value *_value) : key(_key), value(_value) {} 116 }; 117 /// Map of generic types to instantiations of them 118 typedef std::map< AggregateDecl*, std::vector< Instantiation > > Scope; 119 120 std::vector< Scope > scopes; ///< list of scopes, from outermost to innermost 116 /// Wraps value for a specific (Key, TypeList) combination 117 typedef std::pair< TypeList, Value* > Instantiation; 118 /// List of TypeLists paired with their appropriate values 119 typedef std::vector< Instantiation > ValueList; 120 /// Underlying map type; maps keys to a linear list of corresponding TypeLists and values 121 typedef ScopedMap< Key*, ValueList > InnerMap; 122 123 InnerMap instantiations; ///< instantiations 121 124 122 125 public: 123 126 /// Starts a new scope 124 void beginScope() { 125 Scope scope; 126 scopes.push_back(scope); 127 } 127 void beginScope() { instantiations.beginScope(); } 128 128 129 129 /// Ends a scope 130 void endScope() { 131 scopes.pop_back(); 132 } 133 134 /// Default constructor initializes with one scope 135 InstantiationMap() { beginScope(); } 136 137 // private: 138 /// Gets the value for the concrete instantiation of this type, assuming it has already been instantiated in the current scope. 139 /// Returns NULL on none such. 140 Value *lookup( AggregateDecl *generic, const std::list< TypeExpr* >& params ) { 141 ConcreteType key(generic, params); 142 // scan scopes from innermost out 143 for ( typename std::vector< Scope >::const_reverse_iterator scope = scopes.rbegin(); scope != scopes.rend(); ++scope ) { 144 // skip scope if no instantiations of this generic type 145 typename Scope::const_iterator insts = scope->find( generic ); 146 if ( insts == scope->end() ) continue; 147 // look through instantiations for matches to concrete type 148 for ( typename std::vector< Instantiation >::const_iterator inst = insts->second.begin(); inst != insts->second.end(); ++inst ) { 149 if ( inst->key == key ) return inst->value; 130 void endScope() { instantiations.endScope(); } 131 132 /// Gets the value for the (key, typeList) pair, returns NULL on none such. 133 Value *lookup( Key *key, const std::list< TypeExpr* >& params ) const { 134 TypeList typeList( params ); 135 136 // scan scopes for matches to the key 137 for ( typename InnerMap::const_iterator insts = instantiations.find( key ); insts != instantiations.end(); insts = instantiations.findNext( insts, key ) ) { 138 for ( typename ValueList::const_reverse_iterator inst = insts->second.rbegin(); inst != insts->second.rend(); ++inst ) { 139 if ( inst->first == typeList ) return inst->second; 150 140 } 151 141 } 152 // no matching instantiation found142 // no matching instantiations found 153 143 return 0; 154 144 } 155 public: 156 // StructDecl* lookup( StructInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (StructDecl*)lookup( inst->get_baseStruct(), typeSubs ); } 157 // UnionDecl* lookup( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs ) { return (UnionDecl*)lookup( inst->get_baseUnion(), typeSubs ); } 158 159 // private: 160 /// Adds a value for a concrete type to the current scope 161 void insert( AggregateDecl *generic, const std::list< TypeExpr* > ¶ms, Value *value ) { 162 ConcreteType key(generic, params); 163 scopes.back()[generic].push_back( Instantiation( key, value ) ); 164 } 165 // public: 166 // void insert( StructInstType *inst, const std::list< TypeExpr* > &typeSubs, StructDecl *decl ) { insert( inst->get_baseStruct(), typeSubs, decl ); } 167 // void insert( UnionInstType *inst, const std::list< TypeExpr* > &typeSubs, UnionDecl *decl ) { insert( inst->get_baseUnion(), typeSubs, decl ); } 145 146 /// Adds a value for a (key, typeList) pair to the current scope 147 void insert( Key *key, const std::list< TypeExpr* > ¶ms, Value *value ) { 148 instantiations[ key ].push_back( Instantiation( TypeList( params ), value ) ); 149 } 168 150 }; 169 151 … … 197 179 virtual void doEndScope(); 198 180 private: 199 /// Makes a new temporary array holding the offsets of the fields of `type`, and returns a new variable expression referencing it200 Expression *makeOffsetArray( StructInstType *type );201 181 /// Pass the extra type parameters from polymorphic generic arguments or return types into a function application 202 182 void passArgTypeVars( ApplicationExpr *appExpr, Type *parmType, Type *argBaseType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars, std::set< std::string > &seenTypes ); … … 225 205 ObjectDecl *makeTemporary( Type *type ); 226 206 227 std::map< std::string, DeclarationWithType *> assignOps; 228 ResolvExpr::TypeMap< DeclarationWithType > scopedAssignOps; 229 ScopedMap< std::string, DeclarationWithType* > adapters; 207 std::map< std::string, DeclarationWithType *> assignOps; ///< Currently known type variable assignment operators 208 ResolvExpr::TypeMap< DeclarationWithType > scopedAssignOps; ///< Currently known assignment operators 209 ScopedMap< std::string, DeclarationWithType* > adapters; ///< Set of adapter functions in the current scope 210 230 211 DeclarationWithType *retval; 231 212 bool useRetval; … … 233 214 }; 234 215 235 /// Moves polymorphic returns in function types to pointer-type parameters, adds type size and assertion parameters to parameter lists as well 216 /// * Moves polymorphic returns in function types to pointer-type parameters 217 /// * adds type size and assertion parameters to parameter lists 236 218 class Pass2 : public PolyMutator { 237 219 public: … … 244 226 virtual Type *mutate( PointerType *pointerType ); 245 227 virtual Type *mutate( FunctionType *funcType ); 228 246 229 private: 247 230 void addAdapters( FunctionType *functionType ); … … 253 236 class GenericInstantiator : public DeclMutator { 254 237 /// Map of (generic type, parameter list) pairs to concrete type instantiations 255 InstantiationMap< AggregateDecl > instantiations;238 InstantiationMap< AggregateDecl, AggregateDecl > instantiations; 256 239 /// Namer for concrete types 257 240 UniqueName typeNamer; … … 278 261 }; 279 262 280 /// Replaces member expressions for polymorphic types with calculated add-field-offset-and-dereference; 281 /// also fixes offsetof expressions. 282 class MemberExprFixer : public PolyMutator { 283 public: 263 /// Replaces member and size/align/offsetof expressions on polymorphic generic types with calculated expressions. 264 /// * Replaces member expressions for polymorphic types with calculated add-field-offset-and-dereference 265 /// * Calculates polymorphic offsetof expressions from offset array 266 /// * Inserts dynamic calculation of polymorphic type layouts where needed 267 class PolyGenericCalculator : public PolyMutator { 268 public: 284 269 template< typename DeclClass > 285 270 DeclClass *handleDecl( DeclClass *decl, Type *type ); … … 292 277 virtual Type *mutate( FunctionType *funcType ); 293 278 virtual Expression *mutate( MemberExpr *memberExpr ); 279 virtual Expression *mutate( SizeofExpr *sizeofExpr ); 280 virtual Expression *mutate( AlignofExpr *alignofExpr ); 294 281 virtual Expression *mutate( OffsetofExpr *offsetofExpr ); 282 virtual Expression *mutate( OffsetPackExpr *offsetPackExpr ); 283 284 virtual void doBeginScope(); 285 virtual void doEndScope(); 286 287 private: 288 /// Makes a new variable in the current scope with the given name, type & optional initializer 289 ObjectDecl *makeVar( const std::string &name, Type *type, Initializer *init = 0 ); 290 /// returns true if the type has a dynamic layout; such a layout will be stored in appropriately-named local variables when the function returns 291 bool findGeneric( Type *ty ); 292 /// adds type parameters to the layout call; will generate the appropriate parameters if needed 293 void addOtypeParamsToLayoutCall( UntypedExpr *layoutCall, const std::list< Type* > &otypeParams ); 294 295 ScopedSet< std::string > knownLayouts; ///< Set of generic type layouts known in the current scope, indexed by sizeofName 296 ScopedSet< std::string > knownOffsets; ///< Set of non-generic types for which the offset array exists in the current scope, indexed by offsetofName 295 297 }; 296 298 … … 342 344 Pass2 pass2; 343 345 GenericInstantiator instantiator; 344 MemberExprFixer memberFixer;346 PolyGenericCalculator polyCalculator; 345 347 Pass3 pass3; 346 348 … … 348 350 mutateTranslationUnit/*All*/( translationUnit, pass1 ); 349 351 mutateTranslationUnit/*All*/( translationUnit, pass2 ); 350 // instantiateGeneric( translationUnit );351 352 instantiator.mutateDeclarationList( translationUnit ); 352 mutateTranslationUnit/*All*/( translationUnit, memberFixer );353 mutateTranslationUnit/*All*/( translationUnit, polyCalculator ); 353 354 mutateTranslationUnit/*All*/( translationUnit, pass3 ); 354 355 } … … 653 654 654 655 DeclarationWithType *Pass1::mutate( FunctionDecl *functionDecl ) { 655 // if this is a polymorphicassignment function, put it in the map for this scope656 // if this is a assignment function, put it in the map for this scope 656 657 if ( Type *assignedType = isAssignment( functionDecl ) ) { 657 658 if ( ! dynamic_cast< TypeInstType* >( assignedType ) ) { … … 743 744 } 744 745 745 Expression *Pass1::makeOffsetArray( StructInstType *ty ) {746 std::list< Declaration* > &baseMembers = ty->get_baseStruct()->get_members();747 748 // make a new temporary array749 Type *offsetType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );750 std::stringstream lenGen;751 lenGen << baseMembers.size();752 ConstantExpr *lenExpr = new ConstantExpr( Constant( offsetType->clone(), lenGen.str() ) );753 ObjectDecl *arrayTemp = makeTemporary( new ArrayType( Type::Qualifiers(), offsetType, lenExpr, false, false ) );754 755 // build initializer list for temporary756 std::list< Initializer* > inits;757 for ( std::list< Declaration* >::const_iterator member = baseMembers.begin(); member != baseMembers.end(); ++member ) {758 DeclarationWithType *memberDecl;759 if ( DeclarationWithType *origMember = dynamic_cast< DeclarationWithType* >( *member ) ) {760 memberDecl = origMember->clone();761 } else {762 memberDecl = new ObjectDecl( (*member)->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, offsetType->clone(), 0 );763 }764 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) ) );765 }766 arrayTemp->set_init( new ListInit( inits ) );767 768 // return variable pointing to temporary769 return new VariableExpr( arrayTemp );770 }771 772 746 void Pass1::passArgTypeVars( ApplicationExpr *appExpr, Type *parmType, Type *argBaseType, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars, std::set< std::string > &seenTypes ) { 773 747 Type *polyBase = hasPolyBase( parmType, exprTyVars ); … … 782 756 if ( dynamic_cast< StructInstType* >( polyBase ) ) { 783 757 if ( StructInstType *argBaseStructType = dynamic_cast< StructInstType* >( argBaseType ) ) { 784 arg = appExpr->get_args().insert( arg, makeOffsetArray( argBaseStructType ) ); 785 arg++; 758 // zero-length arrays are forbidden by C, so don't pass offset for empty struct 759 if ( ! argBaseStructType->get_baseStruct()->get_members().empty() ) { 760 arg = appExpr->get_args().insert( arg, new OffsetPackExpr( argBaseStructType->clone() ) ); 761 arg++; 762 } 786 763 } else { 787 764 throw SemanticError( "Cannot pass non-struct type for generic struct" ); … … 931 908 return; 932 909 } else if ( arg->get_results().front()->get_isLvalue() ) { 933 // VariableExpr and MemberExpr are lvalues 934 arg = new AddressExpr( arg ); 910 // VariableExpr and MemberExpr are lvalues; need to check this isn't coming from the second arg of a comma expression though (not an lvalue) 911 if ( CommaExpr *commaArg = dynamic_cast< CommaExpr* >( arg ) ) { 912 commaArg->set_arg2( new AddressExpr( commaArg->get_arg2() ) ); 913 } else { 914 arg = new AddressExpr( arg ); 915 } 935 916 } else { 936 917 // use type computed in unification to declare boxed variables … … 1027 1008 } // for 1028 1009 } 1029 1030 1031 1010 1032 1011 FunctionDecl *Pass1::makeAdapter( FunctionType *adaptee, FunctionType *realType, const std::string &mangleName, const TyVarMap &tyVars ) { … … 1428 1407 std::list< TypeDecl* >::const_iterator forallIt = forallParams.begin(); 1429 1408 for ( ; tyIt != tyParams.end() && forallIt != forallParams.end(); ++tyIt, ++forallIt ) { 1430 if ( (*forallIt)->get_kind() != TypeDecl::Any ) continue; // skip types with no assign op (ftype/dtype) 1431 1432 std::list< DeclarationWithType* > &asserts = (*forallIt)->get_assertions(); 1433 assert( ! asserts.empty() && "Type param needs assignment operator assertion" ); 1434 DeclarationWithType *actualDecl = asserts.front(); 1435 TypeInstType *actualType = isTypeInstAssignment( actualDecl ); 1436 assert( actualType && "First assertion of type with assertions should be assignment operator" ); 1409 // Add appropriate mapping to assignment expression environment 1437 1410 TypeExpr *formalTypeExpr = dynamic_cast< TypeExpr* >( *tyIt ); 1438 1411 assert( formalTypeExpr && "type parameters must be type expressions" ); 1439 1412 Type *formalType = formalTypeExpr->get_type(); 1440 assignExpr->get_env()->add( actualType->get_name(), formalType ); 1441 1413 assignExpr->get_env()->add( (*forallIt)->get_name(), formalType ); 1414 1415 // skip types with no assign op (ftype/dtype) 1416 if ( (*forallIt)->get_kind() != TypeDecl::Any ) continue; 1417 1418 // find assignment operator for formal type 1442 1419 DeclarationWithType *assertAssign = 0; 1443 1420 if ( TypeInstType *formalTypeInstType = dynamic_cast< TypeInstType* >( formalType ) ) { … … 1453 1430 } 1454 1431 } 1455 1456 1432 1433 // add inferred parameter for field assignment operator to assignment expression 1434 std::list< DeclarationWithType* > &asserts = (*forallIt)->get_assertions(); 1435 assert( ! asserts.empty() && "Type param needs assignment operator assertion" ); 1436 DeclarationWithType *actualDecl = asserts.front(); 1457 1437 assignExpr->get_inferParams()[ actualDecl->get_uniqueId() ] 1458 1438 = ParamEntry( assertAssign->get_uniqueId(), assertAssign->get_type()->clone(), actualDecl->get_type()->clone(), wrapFunctionDecl( assertAssign ) ); … … 1587 1567 ObjectDecl newPtr( "", DeclarationNode::NoStorageClass, LinkageSpec::C, 0, 1588 1568 new PointerType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) ), 0 ); 1589 // ObjectDecl *newFunPtr = new ObjectDecl( "", DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new FunctionType( Type::Qualifiers(), true ) ), 0 );1590 1569 for ( std::list< TypeDecl *>::const_iterator tyParm = funcType->get_forall().begin(); tyParm != funcType->get_forall().end(); ++tyParm ) { 1591 1570 ObjectDecl *sizeParm, *alignParm; … … 1631 1610 ++last; 1632 1611 1633 if ( dynamic_cast< StructInstType* >( polyBase ) ) { 1634 offsetParm = newPtr.clone(); 1635 offsetParm->set_name( offsetofName( polyBase ) ); 1636 last = funcType->get_parameters().insert( last, offsetParm ); 1637 ++last; 1612 if ( StructInstType *polyBaseStruct = dynamic_cast< StructInstType* >( polyBase ) ) { 1613 // NOTE zero-length arrays are illegal in C, so empty structs have no offset array 1614 if ( ! polyBaseStruct->get_baseStruct()->get_members().empty() ) { 1615 offsetParm = newPtr.clone(); 1616 offsetParm->set_name( offsetofName( polyBase ) ); 1617 last = funcType->get_parameters().insert( last, offsetParm ); 1618 ++last; 1619 } 1638 1620 } 1639 1621 … … 1844 1826 1845 1827 template< typename DeclClass > 1846 DeclClass * MemberExprFixer::handleDecl( DeclClass *decl, Type *type ) {1828 DeclClass * PolyGenericCalculator::handleDecl( DeclClass *decl, Type *type ) { 1847 1829 TyVarMap oldtyVars = scopeTyVars; 1848 1830 makeTyVarMap( type, scopeTyVars ); … … 1854 1836 } 1855 1837 1856 ObjectDecl * MemberExprFixer::mutate( ObjectDecl *objectDecl ) {1838 ObjectDecl * PolyGenericCalculator::mutate( ObjectDecl *objectDecl ) { 1857 1839 return handleDecl( objectDecl, objectDecl->get_type() ); 1858 1840 } 1859 1841 1860 DeclarationWithType * MemberExprFixer::mutate( FunctionDecl *functionDecl ) {1842 DeclarationWithType * PolyGenericCalculator::mutate( FunctionDecl *functionDecl ) { 1861 1843 return handleDecl( functionDecl, functionDecl->get_functionType() ); 1862 1844 } 1863 1845 1864 TypedefDecl * MemberExprFixer::mutate( TypedefDecl *typedefDecl ) {1846 TypedefDecl * PolyGenericCalculator::mutate( TypedefDecl *typedefDecl ) { 1865 1847 return handleDecl( typedefDecl, typedefDecl->get_base() ); 1866 1848 } 1867 1849 1868 TypeDecl * MemberExprFixer::mutate( TypeDecl *typeDecl ) {1850 TypeDecl * PolyGenericCalculator::mutate( TypeDecl *typeDecl ) { 1869 1851 scopeTyVars[ typeDecl->get_name() ] = typeDecl->get_kind(); 1870 1852 return Mutator::mutate( typeDecl ); 1871 1853 } 1872 1854 1873 Type * MemberExprFixer::mutate( PointerType *pointerType ) {1855 Type * PolyGenericCalculator::mutate( PointerType *pointerType ) { 1874 1856 TyVarMap oldtyVars = scopeTyVars; 1875 1857 makeTyVarMap( pointerType, scopeTyVars ); … … 1881 1863 } 1882 1864 1883 Type * MemberExprFixer::mutate( FunctionType *functionType ) {1865 Type * PolyGenericCalculator::mutate( FunctionType *funcType ) { 1884 1866 TyVarMap oldtyVars = scopeTyVars; 1885 makeTyVarMap( functionType, scopeTyVars ); 1886 1887 Type *ret = Mutator::mutate( functionType ); 1867 makeTyVarMap( funcType, scopeTyVars ); 1868 1869 // make sure that any type information passed into the function is accounted for 1870 for ( std::list< DeclarationWithType* >::const_iterator fnParm = funcType->get_parameters().begin(); fnParm != funcType->get_parameters().end(); ++fnParm ) { 1871 // condition here duplicates that in Pass2::mutate( FunctionType* ) 1872 Type *polyBase = hasPolyBase( (*fnParm)->get_type(), scopeTyVars ); 1873 if ( polyBase && ! dynamic_cast< TypeInstType* >( polyBase ) ) { 1874 knownLayouts.insert( sizeofName( polyBase ) ); 1875 } 1876 } 1877 1878 Type *ret = Mutator::mutate( funcType ); 1888 1879 1889 1880 scopeTyVars = oldtyVars; … … 1891 1882 } 1892 1883 1893 Statement * MemberExprFixer::mutate( DeclStmt *declStmt ) {1884 Statement *PolyGenericCalculator::mutate( DeclStmt *declStmt ) { 1894 1885 if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) { 1895 if ( isPolyType( objectDecl->get_type(), scopeTyVars) ) {1886 if ( findGeneric( objectDecl->get_type() ) ) { 1896 1887 // change initialization of a polymorphic value object 1897 1888 // to allocate storage with alloca … … 1945 1936 } 1946 1937 1947 Expression * MemberExprFixer::mutate( MemberExpr *memberExpr ) {1938 Expression *PolyGenericCalculator::mutate( MemberExpr *memberExpr ) { 1948 1939 // mutate, exiting early if no longer MemberExpr 1949 1940 Expression *expr = Mutator::mutate( memberExpr ); … … 1962 1953 Type *objectType = hasPolyBase( objectDecl->get_type(), scopeTyVars, &tyDepth ); 1963 1954 if ( ! objectType ) return memberExpr; 1955 findGeneric( objectType ); // ensure layout for this type is available 1964 1956 1965 1957 Expression *newMemberExpr = 0; … … 1993 1985 } 1994 1986 1995 Expression *MemberExprFixer::mutate( OffsetofExpr *offsetofExpr ) { 1987 ObjectDecl *PolyGenericCalculator::makeVar( const std::string &name, Type *type, Initializer *init ) { 1988 ObjectDecl *newObj = new ObjectDecl( name, DeclarationNode::NoStorageClass, LinkageSpec::C, 0, type, init ); 1989 stmtsToAdd.push_back( new DeclStmt( noLabels, newObj ) ); 1990 return newObj; 1991 } 1992 1993 void PolyGenericCalculator::addOtypeParamsToLayoutCall( UntypedExpr *layoutCall, const std::list< Type* > &otypeParams ) { 1994 for ( std::list< Type* >::const_iterator param = otypeParams.begin(); param != otypeParams.end(); ++param ) { 1995 if ( findGeneric( *param ) ) { 1996 // push size/align vars for a generic parameter back 1997 layoutCall->get_args().push_back( new NameExpr( sizeofName( *param ) ) ); 1998 layoutCall->get_args().push_back( new NameExpr( alignofName( *param ) ) ); 1999 } else { 2000 layoutCall->get_args().push_back( new SizeofExpr( (*param)->clone() ) ); 2001 layoutCall->get_args().push_back( new AlignofExpr( (*param)->clone() ) ); 2002 } 2003 } 2004 } 2005 2006 /// returns true if any of the otype parameters have a dynamic layout and puts all otype parameters in the output list 2007 bool findGenericParams( std::list< TypeDecl* > &baseParams, std::list< Expression* > &typeParams, std::list< Type* > &out ) { 2008 bool hasDynamicLayout = false; 2009 2010 std::list< TypeDecl* >::const_iterator baseParam = baseParams.begin(); 2011 std::list< Expression* >::const_iterator typeParam = typeParams.begin(); 2012 for ( ; baseParam != baseParams.end() && typeParam != typeParams.end(); ++baseParam, ++typeParam ) { 2013 // skip non-otype parameters 2014 if ( (*baseParam)->get_kind() != TypeDecl::Any ) continue; 2015 TypeExpr *typeExpr = dynamic_cast< TypeExpr* >( *typeParam ); 2016 assert( typeExpr && "all otype parameters should be type expressions" ); 2017 2018 Type *type = typeExpr->get_type(); 2019 out.push_back( type ); 2020 if ( isPolyType( type ) ) hasDynamicLayout = true; 2021 } 2022 assert( baseParam == baseParams.end() && typeParam == typeParams.end() ); 2023 2024 return hasDynamicLayout; 2025 } 2026 2027 bool PolyGenericCalculator::findGeneric( Type *ty ) { 2028 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( ty ) ) { 2029 // duplicate logic from isPolyType() 2030 if ( env ) { 2031 if ( Type *newType = env->lookup( typeInst->get_name() ) ) { 2032 return findGeneric( newType ); 2033 } // if 2034 } // if 2035 if ( scopeTyVars.find( typeInst->get_name() ) != scopeTyVars.end() ) { 2036 // NOTE assumes here that getting put in the scopeTyVars included having the layout variables set 2037 return true; 2038 } 2039 return false; 2040 } else if ( StructInstType *structTy = dynamic_cast< StructInstType* >( ty ) ) { 2041 // check if this type already has a layout generated for it 2042 std::string sizeName = sizeofName( ty ); 2043 if ( knownLayouts.find( sizeName ) != knownLayouts.end() ) return true; 2044 2045 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized 2046 std::list< Type* > otypeParams; 2047 if ( ! findGenericParams( *structTy->get_baseParameters(), structTy->get_parameters(), otypeParams ) ) return false; 2048 2049 // insert local variables for layout and generate call to layout function 2050 knownLayouts.insert( sizeName ); // done early so as not to interfere with the later addition of parameters to the layout call 2051 Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 2052 2053 int n_members = structTy->get_baseStruct()->get_members().size(); 2054 if ( n_members == 0 ) { 2055 // all empty structs have the same layout - size 1, align 1 2056 makeVar( sizeName, layoutType, new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) ); 2057 makeVar( alignofName( ty ), layoutType->clone(), new SingleInit( new ConstantExpr( Constant::from( (unsigned long)1 ) ) ) ); 2058 // NOTE zero-length arrays are forbidden in C, so empty structs have no offsetof array 2059 } else { 2060 ObjectDecl *sizeVar = makeVar( sizeName, layoutType ); 2061 ObjectDecl *alignVar = makeVar( alignofName( ty ), layoutType->clone() ); 2062 ObjectDecl *offsetVar = makeVar( offsetofName( ty ), new ArrayType( Type::Qualifiers(), layoutType->clone(), new ConstantExpr( Constant::from( n_members ) ), false, false ) ); 2063 2064 // generate call to layout function 2065 UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( "__layoutof_" + structTy->get_baseStruct()->get_name() ) ); 2066 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( sizeVar ) ) ); 2067 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( alignVar ) ) ); 2068 layoutCall->get_args().push_back( new VariableExpr( offsetVar ) ); 2069 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 2070 2071 stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) ); 2072 } 2073 2074 return true; 2075 } else if ( UnionInstType *unionTy = dynamic_cast< UnionInstType* >( ty ) ) { 2076 // check if this type already has a layout generated for it 2077 std::string sizeName = sizeofName( ty ); 2078 if ( knownLayouts.find( sizeName ) != knownLayouts.end() ) return true; 2079 2080 // check if any of the type parameters have dynamic layout; if none do, this type is (or will be) monomorphized 2081 std::list< Type* > otypeParams; 2082 if ( ! findGenericParams( *unionTy->get_baseParameters(), unionTy->get_parameters(), otypeParams ) ) return false; 2083 2084 // insert local variables for layout and generate call to layout function 2085 knownLayouts.insert( sizeName ); // done early so as not to interfere with the later addition of parameters to the layout call 2086 Type *layoutType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 2087 2088 ObjectDecl *sizeVar = makeVar( sizeName, layoutType ); 2089 ObjectDecl *alignVar = makeVar( alignofName( ty ), layoutType->clone() ); 2090 2091 // generate call to layout function 2092 UntypedExpr *layoutCall = new UntypedExpr( new NameExpr( "__layoutof_" + unionTy->get_baseUnion()->get_name() ) ); 2093 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( sizeVar ) ) ); 2094 layoutCall->get_args().push_back( new AddressExpr( new VariableExpr( alignVar ) ) ); 2095 addOtypeParamsToLayoutCall( layoutCall, otypeParams ); 2096 2097 stmtsToAdd.push_back( new ExprStmt( noLabels, layoutCall ) ); 2098 2099 return true; 2100 } 2101 2102 return false; 2103 } 2104 2105 Expression *PolyGenericCalculator::mutate( SizeofExpr *sizeofExpr ) { 2106 Type *ty = sizeofExpr->get_type(); 2107 if ( findGeneric( ty ) ) { 2108 Expression *ret = new NameExpr( sizeofName( ty ) ); 2109 delete sizeofExpr; 2110 return ret; 2111 } 2112 return sizeofExpr; 2113 } 2114 2115 Expression *PolyGenericCalculator::mutate( AlignofExpr *alignofExpr ) { 2116 Type *ty = alignofExpr->get_type(); 2117 if ( findGeneric( ty ) ) { 2118 Expression *ret = new NameExpr( alignofName( ty ) ); 2119 delete alignofExpr; 2120 return ret; 2121 } 2122 return alignofExpr; 2123 } 2124 2125 Expression *PolyGenericCalculator::mutate( OffsetofExpr *offsetofExpr ) { 1996 2126 // mutate, exiting early if no longer OffsetofExpr 1997 2127 Expression *expr = Mutator::mutate( offsetofExpr ); … … 2000 2130 2001 2131 // only mutate expressions for polymorphic structs/unions 2002 Type *ty = isPolyType( offsetofExpr->get_type(), scopeTyVars);2003 if ( ! ty) return offsetofExpr;2004 2132 Type *ty = offsetofExpr->get_type(); 2133 if ( ! findGeneric( ty ) ) return offsetofExpr; 2134 2005 2135 if ( StructInstType *structType = dynamic_cast< StructInstType* >( ty ) ) { 2006 2136 // replace offsetof expression by index into offset array … … 2018 2148 } 2019 2149 2150 Expression *PolyGenericCalculator::mutate( OffsetPackExpr *offsetPackExpr ) { 2151 StructInstType *ty = offsetPackExpr->get_type(); 2152 2153 Expression *ret = 0; 2154 if ( findGeneric( ty ) ) { 2155 // pull offset back from generated type information 2156 ret = new NameExpr( offsetofName( ty ) ); 2157 } else { 2158 std::string offsetName = offsetofName( ty ); 2159 if ( knownOffsets.find( offsetName ) != knownOffsets.end() ) { 2160 // use the already-generated offsets for this type 2161 ret = new NameExpr( offsetName ); 2162 } else { 2163 knownOffsets.insert( offsetName ); 2164 2165 std::list< Declaration* > &baseMembers = ty->get_baseStruct()->get_members(); 2166 Type *offsetType = new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ); 2167 2168 // build initializer list for offset array 2169 std::list< Initializer* > inits; 2170 for ( std::list< Declaration* >::const_iterator member = baseMembers.begin(); member != baseMembers.end(); ++member ) { 2171 DeclarationWithType *memberDecl; 2172 if ( DeclarationWithType *origMember = dynamic_cast< DeclarationWithType* >( *member ) ) { 2173 memberDecl = origMember->clone(); 2174 } else { 2175 memberDecl = new ObjectDecl( (*member)->get_name(), DeclarationNode::NoStorageClass, LinkageSpec::Cforall, 0, offsetType->clone(), 0 ); 2176 } 2177 inits.push_back( new SingleInit( new OffsetofExpr( ty->clone(), memberDecl ) ) ); 2178 } 2179 2180 // build the offset array and replace the pack with a reference to it 2181 ObjectDecl *offsetArray = makeVar( offsetName, new ArrayType( Type::Qualifiers(), offsetType, new ConstantExpr( Constant::from( baseMembers.size() ) ), false, false ), 2182 new ListInit( inits ) ); 2183 ret = new VariableExpr( offsetArray ); 2184 } 2185 } 2186 2187 delete offsetPackExpr; 2188 return ret; 2189 } 2190 2191 void PolyGenericCalculator::doBeginScope() { 2192 knownLayouts.beginScope(); 2193 knownOffsets.beginScope(); 2194 } 2195 2196 void PolyGenericCalculator::doEndScope() { 2197 knownLayouts.endScope(); 2198 knownOffsets.beginScope(); 2199 } 2200 2020 2201 ////////////////////////////////////////// Pass3 //////////////////////////////////////////////////// 2021 2202 -
src/GenPoly/ScopedMap.h
r3aba311 r37218fc 17 17 #define _SCOPEDMAP_H 18 18 19 #include <cassert> 19 20 #include <iterator> 20 21 #include <map> … … 164 165 void endScope() { 165 166 scopes.pop_back(); 167 assert( ! scopes.empty() ); 166 168 } 167 169 … … 188 190 return end(); 189 191 } 190 const_iterator find( const Key &key ) const { return const_iterator( find( key ) ); } 192 const_iterator find( const Key &key ) const { 193 return const_iterator( const_cast< ScopedMap< Key, Value >* >(this)->find( key ) ); 194 } 191 195 192 196 /// Finds the given key in the outermost scope inside the given scope where it occurs … … 200 204 return end(); 201 205 } 202 const_iterator findNext( const_iterator &it, const Key &key ) const { return const_iterator( findNext( it, key ) ); } 206 const_iterator findNext( const_iterator &it, const Key &key ) const { 207 return const_iterator( const_cast< ScopedMap< Key, Value >* >(this)->findNext( it, key ) ); 208 } 203 209 204 210 /// Inserts the given key-value pair into the outermost scope … … 208 214 } 209 215 std::pair< iterator, bool > insert( const Key &key, const Value &value ) { return insert( std::make_pair( key, value ) ); } 210 216 217 Value& operator[] ( const Key &key ) { 218 iterator slot = find( key ); 219 if ( slot != end() ) return slot->second; 220 return insert( key, Value() ).first->second; 221 } 211 222 }; 212 223 } // namespace GenPoly -
src/InitTweak/InitModel.h
r3aba311 r37218fc 75 75 void visit( UntypedOffsetofExpr * ) { throw 0; } 76 76 void visit( OffsetofExpr * ) { throw 0; } 77 void visit( OffsetPackExpr * ) { throw 0; } 77 78 void visit( AttrExpr * ) { throw 0; } 78 79 void visit( LogicalExpr * ) { throw 0; } -
src/Parser/ExpressionNode.cc
r3aba311 r37218fc 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Mar 13 12:34:38201613 // Update Count : 2 7212 // Last Modified On : Fri Apr 8 15:43:05 2016 13 // Update Count : 296 14 14 // 15 15 … … 22 22 23 23 #include "ParseNode.h" 24 #include "TypeData.h" 24 25 #include "SynTree/Constant.h" 25 26 #include "SynTree/Expression.h" 27 #include "SynTree/Declaration.h" 26 28 #include "Common/UnimplementedError.h" 27 29 #include "parseutility.h" … … 872 874 } 873 875 876 877 CompoundLiteralNode::CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids ) : type( type ), kids( kids ) {} 878 CompoundLiteralNode::CompoundLiteralNode( const CompoundLiteralNode &other ) : ExpressionNode( other ), type( other.type ), kids( other.kids ) {} 879 880 CompoundLiteralNode::~CompoundLiteralNode() { 881 delete kids; 882 delete type; 883 } 884 885 CompoundLiteralNode *CompoundLiteralNode::clone() const { 886 return new CompoundLiteralNode( *this ); 887 } 888 889 void CompoundLiteralNode::print( std::ostream &os, int indent ) const { 890 os << string( indent,' ' ) << "CompoundLiteralNode:" << endl; 891 892 os << string( indent + 2, ' ' ) << "type:" << endl; 893 if ( type != 0 ) 894 type->print( os, indent + 4 ); 895 896 os << string( indent + 2, ' ' ) << "initialization:" << endl; 897 if ( kids != 0 ) 898 kids->printList( os, indent + 4 ); 899 } 900 901 void CompoundLiteralNode::printOneLine( std::ostream &os, int indent ) const { 902 os << "( "; 903 if ( type ) type->print( os ); 904 os << ", "; 905 if ( kids ) kids->printOneLine( os ); 906 os << ") "; 907 } 908 909 Expression *CompoundLiteralNode::build() const { 910 Declaration * newDecl = type->build(); // compound literal type 911 if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type 912 return new CompoundLiteralExpr( newDeclWithType->get_type(), kids->build() ); 913 // these types do not have associated type information 914 } else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl ) ) { 915 return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), kids->build() ); 916 } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl ) ) { 917 return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), kids->build() ); 918 } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl ) ) { 919 return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), kids->build() ); 920 } else { 921 assert( false ); 922 } // if 923 } 924 925 874 926 ExpressionNode *flattenCommas( ExpressionNode *list ) { 875 927 if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) { -
src/Parser/ParseNode.h
r3aba311 r37218fc 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Rob Schluntz 12 // Last Modified On : Mon Apr 04 17:04:22 201613 // Update Count : 19012 // Last Modified On : Mon Apr 11 11:50:52 2016 13 // Update Count : 205 14 14 // 15 15 … … 538 538 }; 539 539 540 class CompoundLiteralNode : public ExpressionNode { 541 public: 542 CompoundLiteralNode( DeclarationNode *type, InitializerNode *kids ); 543 CompoundLiteralNode( const CompoundLiteralNode &type ); 544 ~CompoundLiteralNode(); 545 546 virtual CompoundLiteralNode *clone() const; 547 548 DeclarationNode *get_type() const { return type; } 549 CompoundLiteralNode *set_type( DeclarationNode *t ) { type = t; return this; } 550 551 InitializerNode *get_initializer() const { return kids; } 552 CompoundLiteralNode *set_initializer( InitializerNode *k ) { kids = k; return this; } 553 554 void print( std::ostream &, int indent = 0 ) const; 555 void printOneLine( std::ostream &, int indent = 0 ) const; 556 557 virtual Expression *build() const; 558 private: 559 DeclarationNode *type; 560 InitializerNode *kids; 561 }; 562 540 563 template< typename SynTreeType, typename NodeType > 541 564 void buildList( const NodeType *firstNode, std::list< SynTreeType *> &outputList ) { -
src/Parser/parser.cc
r3aba311 r37218fc 5180 5180 /* Line 1806 of yacc.c */ 5181 5181 #line 374 "parser.yy" 5182 { (yyval.en) = 0; }5182 { (yyval.en) = new CompoundLiteralNode( (yyvsp[(2) - (7)].decl), new InitializerNode( (yyvsp[(5) - (7)].in), true ) ); } 5183 5183 break; 5184 5184 -
src/Parser/parser.yy
r3aba311 r37218fc 10 10 // Created On : Sat Sep 1 20:22:55 2001 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 24 16:16:16201613 // Update Count : 1 49812 // Last Modified On : Fri Apr 8 16:21:55 2016 13 // Update Count : 1508 14 14 // 15 15 … … 372 372 { $$ = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), $1 ); } 373 373 | '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99 374 { $$ = 0; }374 { $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); } 375 375 | postfix_expression '{' argument_expression_list '}' // CFA 376 376 { -
src/ResolvExpr/AlternativeFinder.cc
r3aba311 r37218fc 848 848 } 849 849 850 void AlternativeFinder::visit( OffsetPackExpr *offsetPackExpr ) { 851 alternatives.push_back( Alternative( offsetPackExpr->clone(), env, Cost::zero ) ); 852 } 853 850 854 void AlternativeFinder::resolveAttr( DeclarationWithType *funcDecl, FunctionType *function, Type *argType, const TypeEnvironment &env ) { 851 855 // assume no polymorphism -
src/ResolvExpr/AlternativeFinder.h
r3aba311 r37218fc 59 59 virtual void visit( UntypedOffsetofExpr *offsetofExpr ); 60 60 virtual void visit( OffsetofExpr *offsetofExpr ); 61 virtual void visit( OffsetPackExpr *offsetPackExpr ); 61 62 virtual void visit( AttrExpr *attrExpr ); 62 63 virtual void visit( LogicalExpr *logicalExpr ); -
src/SymTab/AddVisit.h
r3aba311 r37218fc 9 9 // Author : Richard C. Bilson 10 10 // Created On : Sun May 17 16:14:32 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T ue Jul 14 12:26:17 201513 // Update Count : 411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Apr 7 14:42:21 2016 13 // Update Count : 5 14 14 // 15 15 … … 27 27 28 28 template< typename Visitor > 29 inline void addVisitStatement( Statement *stmt, Visitor &visitor ) {30 maybeAccept( stmt, visitor );31 /// if ( ! declsToAdd.empty() ) {32 /// CompoundStmt *compound = new CompoundStmt( noLabels );33 /// compound->get_kids().push_back( stmt );34 /// addDecls( declsToAdd, compound->get_kids(), compound->get_kids().end() );35 /// }36 }37 38 template< typename Visitor >39 29 inline void addVisit(CompoundStmt *compoundStmt, Visitor &visitor) { 40 30 addVisitStatementList( compoundStmt->get_kids(), visitor ); 41 }42 43 template< typename Visitor >44 inline void addVisit(IfStmt *ifStmt, Visitor &visitor) {45 addVisitStatement( ifStmt->get_thenPart(), visitor );46 addVisitStatement( ifStmt->get_elsePart(), visitor );47 maybeAccept( ifStmt->get_condition(), visitor );48 }49 50 template< typename Visitor >51 inline void addVisit(WhileStmt *whileStmt, Visitor &visitor) {52 addVisitStatement( whileStmt->get_body(), visitor );53 maybeAccept( whileStmt->get_condition(), visitor );54 }55 56 template< typename Visitor >57 inline void addVisit(ForStmt *forStmt, Visitor &visitor) {58 addVisitStatement( forStmt->get_body(), visitor );59 acceptAll( forStmt->get_initialization(), visitor );60 maybeAccept( forStmt->get_condition(), visitor );61 maybeAccept( forStmt->get_increment(), visitor );62 31 } 63 32 … … 74 43 } 75 44 76 template< typename Visitor > 77 inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) { 78 addVisitStatementList( caseStmt->get_statements(), visitor ); 79 maybeAccept( caseStmt->get_condition(), visitor ); 80 } 81 82 template< typename Visitor > 83 inline void addVisit(CatchStmt *cathStmt, Visitor &visitor) { 84 addVisitStatement( cathStmt->get_body(), visitor ); 85 maybeAccept( cathStmt->get_decl(), visitor ); 86 } 45 // template< typename Visitor > 46 // inline void addVisit(CaseStmt *caseStmt, Visitor &visitor) { 47 // addVisitStatementList( caseStmt->get_statements(), visitor ); 48 // maybeAccept( caseStmt->get_condition(), visitor ); 49 // } 87 50 } // namespace SymTab 88 51 -
src/SymTab/Indexer.cc
r3aba311 r37218fc 344 344 maybeAccept( offsetofExpr->get_type(), *this ); 345 345 maybeAccept( offsetofExpr->get_member(), *this ); 346 } 347 348 void Indexer::visit( OffsetPackExpr *offsetPackExpr ) { 349 acceptAllNewScope( offsetPackExpr->get_results(), *this ); 350 maybeAccept( offsetPackExpr->get_type(), *this ); 346 351 } 347 352 -
src/SymTab/Indexer.h
r3aba311 r37218fc 59 59 virtual void visit( UntypedOffsetofExpr *offsetofExpr ); 60 60 virtual void visit( OffsetofExpr *offsetofExpr ); 61 virtual void visit( OffsetPackExpr *offsetPackExpr ); 61 62 virtual void visit( AttrExpr *attrExpr ); 62 63 virtual void visit( LogicalExpr *logicalExpr ); -
src/SymTab/Validate.cc
r3aba311 r37218fc 10 10 // Created On : Sun May 17 21:50:04 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:31:39201613 // Update Count : 2 2612 // Last Modified On : Thu Apr 7 16:45:30 2016 13 // Update Count : 243 14 14 // 15 15 … … 40 40 #include <list> 41 41 #include <iterator> 42 #include "Common/utility.h" 43 #include "Common/UniqueName.h" 42 44 #include "Validate.h" 43 45 #include "SynTree/Visitor.h" 44 46 #include "SynTree/Mutator.h" 45 47 #include "SynTree/Type.h" 48 #include "SynTree/Expression.h" 46 49 #include "SynTree/Statement.h" 47 50 #include "SynTree/TypeSubstitution.h" … … 49 52 #include "FixFunction.h" 50 53 // #include "ImplementationType.h" 51 #include "Common/utility.h" 52 #include "Common/UniqueName.h" 54 #include "GenPoly/DeclMutator.h" 53 55 #include "AddVisit.h" 54 56 #include "MakeLibCfa.h" … … 70 72 71 73 virtual void visit( CompoundStmt *compoundStmt ); 72 virtual void visit( IfStmt *ifStmt );73 virtual void visit( WhileStmt *whileStmt );74 virtual void visit( ForStmt *forStmt );75 74 virtual void visit( SwitchStmt *switchStmt ); 76 75 virtual void visit( ChooseStmt *chooseStmt ); 77 virtual void visit( CaseStmt *caseStmt ); 78 virtual void visit( CatchStmt *catchStmt ); 76 // virtual void visit( CaseStmt *caseStmt ); 79 77 private: 80 78 HoistStruct(); … … 144 142 145 143 virtual void visit( CompoundStmt *compoundStmt ); 146 virtual void visit( IfStmt *ifStmt );147 virtual void visit( WhileStmt *whileStmt );148 virtual void visit( ForStmt *forStmt );149 144 virtual void visit( SwitchStmt *switchStmt ); 150 145 virtual void visit( ChooseStmt *chooseStmt ); 151 virtual void visit( CaseStmt *caseStmt ); 152 virtual void visit( CatchStmt *catchStmt ); 146 // virtual void visit( CaseStmt *caseStmt ); 153 147 154 148 AutogenerateRoutines() : functionNesting( 0 ) {} … … 166 160 /// and return something if the return type is non-void. 167 161 static void checkFunctionReturns( std::list< Declaration * > & translationUnit ); 168 169 162 private: 170 163 virtual void visit( FunctionDecl * functionDecl ); … … 202 195 }; 203 196 197 class CompoundLiteral : public GenPoly::DeclMutator { 198 DeclarationNode::StorageClass storageclass = DeclarationNode::NoStorageClass; 199 200 virtual DeclarationWithType * mutate( ObjectDecl *objectDecl ); 201 virtual Expression *mutate( CompoundLiteralExpr *compLitExpr ); 202 }; 203 204 204 void validate( std::list< Declaration * > &translationUnit, bool doDebug ) { 205 205 Pass1 pass1; 206 206 Pass2 pass2( doDebug, 0 ); 207 207 Pass3 pass3( 0 ); 208 CompoundLiteral compoundliteral; 209 208 210 EliminateTypedef::eliminateTypedef( translationUnit ); 209 211 HoistStruct::hoistStruct( translationUnit ); … … 211 213 acceptAll( translationUnit, pass2 ); 212 214 ReturnChecker::checkFunctionReturns( translationUnit ); 215 mutateAll( translationUnit, compoundliteral ); 213 216 AutogenerateRoutines::autogenerateRoutines( translationUnit ); 214 217 acceptAll( translationUnit, pass3 ); … … 292 295 } 293 296 294 void HoistStruct::visit( IfStmt *ifStmt ) {295 addVisit( ifStmt, *this );296 }297 298 void HoistStruct::visit( WhileStmt *whileStmt ) {299 addVisit( whileStmt, *this );300 }301 302 void HoistStruct::visit( ForStmt *forStmt ) {303 addVisit( forStmt, *this );304 }305 306 297 void HoistStruct::visit( SwitchStmt *switchStmt ) { 307 298 addVisit( switchStmt, *this ); … … 312 303 } 313 304 314 void HoistStruct::visit( CaseStmt *caseStmt ) { 315 addVisit( caseStmt, *this ); 316 } 317 318 void HoistStruct::visit( CatchStmt *cathStmt ) { 319 addVisit( cathStmt, *this ); 320 } 305 // void HoistStruct::visit( CaseStmt *caseStmt ) { 306 // addVisit( caseStmt, *this ); 307 // } 321 308 322 309 void Pass1::visit( EnumDecl *enumDecl ) { … … 874 861 } 875 862 876 void AutogenerateRoutines::visit( IfStmt *ifStmt ) {877 visitStatement( ifStmt );878 }879 880 void AutogenerateRoutines::visit( WhileStmt *whileStmt ) {881 visitStatement( whileStmt );882 }883 884 void AutogenerateRoutines::visit( ForStmt *forStmt ) {885 visitStatement( forStmt );886 }887 888 863 void AutogenerateRoutines::visit( SwitchStmt *switchStmt ) { 889 864 visitStatement( switchStmt ); … … 894 869 } 895 870 896 void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 897 visitStatement( caseStmt ); 898 } 899 900 void AutogenerateRoutines::visit( CatchStmt *cathStmt ) { 901 visitStatement( cathStmt ); 902 } 871 // void AutogenerateRoutines::visit( CaseStmt *caseStmt ) { 872 // visitStatement( caseStmt ); 873 // } 903 874 904 875 void ReturnChecker::checkFunctionReturns( std::list< Declaration * > & translationUnit ) { … … 1080 1051 } 1081 1052 1053 DeclarationWithType * CompoundLiteral::mutate( ObjectDecl *objectDecl ) { 1054 storageclass = objectDecl->get_storageClass(); 1055 DeclarationWithType * temp = Mutator::mutate( objectDecl ); 1056 storageclass = DeclarationNode::NoStorageClass; 1057 return temp; 1058 } 1059 1060 Expression *CompoundLiteral::mutate( CompoundLiteralExpr *compLitExpr ) { 1061 // transform [storage_class] ... (struct S){ 3, ... }; 1062 // into [storage_class] struct S temp = { 3, ... }; 1063 static UniqueName indexName( "_compLit" ); 1064 1065 ObjectDecl *tempvar = new ObjectDecl( indexName.newName(), storageclass, LinkageSpec::C, 0, compLitExpr->get_type(), compLitExpr->get_initializer() ); 1066 compLitExpr->set_type( 0 ); 1067 compLitExpr->set_initializer( 0 ); 1068 delete compLitExpr; 1069 DeclarationWithType * newtempvar = mutate( tempvar ); 1070 addDeclaration( newtempvar ); // add modified temporary to current block 1071 return new VariableExpr( newtempvar ); 1072 } 1082 1073 } // namespace SymTab 1083 1074 -
src/SynTree/Expression.cc
r3aba311 r37218fc 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Dec 09 14:10:29 201513 // Update Count : 3411 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 17:16:23 2016 13 // Update Count : 40 14 14 // 15 15 … … 22 22 23 23 #include "Type.h" 24 #include "Initializer.h" 24 25 #include "Expression.h" 25 26 #include "Declaration.h" … … 211 212 212 213 os << " of "; 214 215 if ( type ) { 216 type->print(os, indent + 2); 217 } else { 218 os << "<NULL>"; 219 } 220 221 os << std::endl; 222 Expression::print( os, indent ); 223 } 224 225 OffsetPackExpr::OffsetPackExpr( StructInstType *type_, Expression *aname_ ) : Expression( aname_ ), type( type_ ) { 226 add_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) ); 227 } 228 229 OffsetPackExpr::OffsetPackExpr( const OffsetPackExpr &other ) : Expression( other ), type( maybeClone( other.type ) ) {} 230 231 OffsetPackExpr::~OffsetPackExpr() { delete type; } 232 233 void OffsetPackExpr::print( std::ostream &os, int indent ) const { 234 os << std::string( indent, ' ' ) << "Offset pack expression on "; 213 235 214 236 if ( type ) { … … 443 465 444 466 467 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) { 468 add_result( type->clone() ); 469 } 470 471 CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {} 472 473 CompoundLiteralExpr::~CompoundLiteralExpr() { 474 delete initializer; 475 delete type; 476 } 477 478 void CompoundLiteralExpr::print( std::ostream &os, int indent ) const { 479 os << "Compound Literal Expression: " << std::endl; 480 if ( type ) type->print( os, indent + 2 ); 481 if ( initializer ) initializer->print( os, indent + 2 ); 482 } 483 445 484 446 485 std::ostream & operator<<( std::ostream & out, Expression * expr ) { -
src/SynTree/Expression.h
r3aba311 r37218fc 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : Wed Dec 09 14:10:21 201513 // Update Count : 1911 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Apr 8 17:18:06 2016 13 // Update Count : 21 14 14 // 15 15 … … 362 362 }; 363 363 364 /// Expression representing a pack of field-offsets for a generic type 365 class OffsetPackExpr : public Expression { 366 public: 367 OffsetPackExpr( StructInstType *type_, Expression *aname_ = 0 ); 368 OffsetPackExpr( const OffsetPackExpr &other ); 369 virtual ~OffsetPackExpr(); 370 371 StructInstType *get_type() const { return type; } 372 void set_type( StructInstType *newValue ) { type = newValue; } 373 374 virtual OffsetPackExpr *clone() const { return new OffsetPackExpr( *this ); } 375 virtual void accept( Visitor &v ) { v.visit( this ); } 376 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 377 378 virtual void print( std::ostream &os, int indent = 0 ) const; 379 380 private: 381 StructInstType *type; 382 }; 383 364 384 /// AttrExpr represents an @attribute expression (like sizeof, but user-defined) 365 385 class AttrExpr : public Expression { … … 557 577 }; 558 578 579 /// CompoundLiteralExpr represents a C99 'compound literal' 580 class CompoundLiteralExpr : public Expression { 581 public: 582 CompoundLiteralExpr( Type * type, Initializer * initializer ); 583 CompoundLiteralExpr( const CompoundLiteralExpr &other ); 584 ~CompoundLiteralExpr(); 585 586 Type * get_type() const { return type; } 587 void set_type( Type * t ) { type = t; } 588 589 Initializer * get_initializer() const { return initializer; } 590 void set_initializer( Initializer * i ) { initializer = i; } 591 592 virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *this ); } 593 virtual void accept( Visitor &v ) { v.visit( this ); } 594 virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); } 595 virtual void print( std::ostream &os, int indent = 0 ) const; 596 private: 597 Type * type; 598 Initializer * initializer; 599 }; 600 559 601 std::ostream & operator<<( std::ostream & out, Expression * expr ); 560 602 -
src/SynTree/Mutator.cc
r3aba311 r37218fc 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:28:20201613 // Update Count : 1 212 // Last Modified On : Fri Apr 1 18:05:16 2016 13 // Update Count : 16 14 14 // 15 15 … … 274 274 } 275 275 276 Expression *Mutator::mutate( OffsetPackExpr *offsetPackExpr ) { 277 mutateAll( offsetPackExpr->get_results(), *this ); 278 offsetPackExpr->set_type( maybeMutate( offsetPackExpr->get_type(), *this ) ); 279 return offsetPackExpr; 280 } 281 276 282 Expression *Mutator::mutate( AttrExpr *attrExpr ) { 277 283 mutateAll( attrExpr->get_results(), *this ); … … 334 340 mutateAll( valofExpr->get_results(), *this ); 335 341 return valofExpr; 342 } 343 344 Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) { 345 mutateAll( compLitExpr->get_results(), *this ); 346 compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) ); 347 compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) ); 348 return compLitExpr; 336 349 } 337 350 -
src/SynTree/Mutator.h
r3aba311 r37218fc 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:33:11201613 // Update Count : 912 // Last Modified On : Fri Apr 1 17:26:56 2016 13 // Update Count : 10 14 14 // 15 15 #include <cassert> … … 67 67 virtual Expression* mutate( UntypedOffsetofExpr *offsetofExpr ); 68 68 virtual Expression* mutate( OffsetofExpr *offsetofExpr ); 69 virtual Expression* mutate( OffsetPackExpr *offsetPackExpr ); 69 70 virtual Expression* mutate( AttrExpr *attrExpr ); 70 71 virtual Expression* mutate( LogicalExpr *logicalExpr ); … … 76 77 virtual Expression* mutate( AsmExpr *asmExpr ); 77 78 virtual Expression* mutate( UntypedValofExpr *valofExpr ); 79 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ); 78 80 79 81 virtual Type* mutate( VoidType *basicType ); -
src/SynTree/SynTree.h
r3aba311 r37218fc 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:29:00201613 // Update Count : 412 // Last Modified On : Fri Apr 1 16:47:44 2016 13 // Update Count : 5 14 14 // 15 15 … … 72 72 class UntypedOffsetofExpr; 73 73 class OffsetofExpr; 74 class OffsetPackExpr; 74 75 class AttrExpr; 75 76 class LogicalExpr; … … 81 82 class AsmExpr; 82 83 class UntypedValofExpr; 84 class CompoundLiteralExpr; 83 85 84 86 class Type; -
src/SynTree/Visitor.cc
r3aba311 r37218fc 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:29:23 201613 // Update Count : 1 612 // Last Modified On : Fri Apr 1 18:05:13 2016 13 // Update Count : 18 14 14 // 15 15 … … 230 230 } 231 231 232 void Visitor::visit( OffsetPackExpr *offsetPackExpr ) { 233 acceptAll( offsetPackExpr->get_results(), *this ); 234 maybeAccept( offsetPackExpr->get_type(), *this ); 235 } 236 232 237 void Visitor::visit( AttrExpr *attrExpr ) { 233 238 acceptAll( attrExpr->get_results(), *this ); … … 282 287 acceptAll( valofExpr->get_results(), *this ); 283 288 maybeAccept( valofExpr->get_body(), *this ); 289 } 290 291 void Visitor::visit( CompoundLiteralExpr *compLitExpr ) { 292 acceptAll( compLitExpr->get_results(), *this ); 293 maybeAccept( compLitExpr->get_type(), *this ); 294 maybeAccept( compLitExpr->get_initializer(), *this ); 284 295 } 285 296 -
src/SynTree/Visitor.h
r3aba311 r37218fc 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 17:33:35 201613 // Update Count : 612 // Last Modified On : Fri Apr 1 17:26:55 2016 13 // Update Count : 7 14 14 // 15 15 … … 67 67 virtual void visit( UntypedOffsetofExpr *offsetofExpr ); 68 68 virtual void visit( OffsetofExpr *offsetofExpr ); 69 virtual void visit( OffsetPackExpr *offsetPackExpr ); 69 70 virtual void visit( AttrExpr *attrExpr ); 70 71 virtual void visit( LogicalExpr *logicalExpr ); … … 76 77 virtual void visit( AsmExpr *asmExpr ); 77 78 virtual void visit( UntypedValofExpr *valofExpr ); 79 virtual void visit( CompoundLiteralExpr *compLitExpr ); 78 80 79 81 virtual void visit( VoidType *basicType ); -
src/Tuples/FlattenTuple.cc
r3aba311 r37218fc 49 49 void FlattenTuple::CollectArgs::visit( UntypedOffsetofExpr *expr ) { currentArgs.insert( currentArgs.end(), expr ); } 50 50 void FlattenTuple::CollectArgs::visit( OffsetofExpr *expr ) { currentArgs.insert( currentArgs.end(), expr ); } 51 void FlattenTuple::CollectArgs::visit( OffsetPackExpr *expr ) { currentArgs.insert( currentArgs.end(), expr ); } 51 52 void FlattenTuple::CollectArgs::visit( AttrExpr *expr ) { currentArgs.insert( currentArgs.end(), expr ); } 52 53 void FlattenTuple::CollectArgs::visit( LogicalExpr *expr ) { currentArgs.insert( currentArgs.end(), expr ); } -
src/Tuples/FlattenTuple.h
r3aba311 r37218fc 45 45 virtual void visit( UntypedOffsetofExpr * ); 46 46 virtual void visit( OffsetofExpr * ); 47 virtual void visit( OffsetPackExpr * ); 47 48 virtual void visit( AttrExpr * ); 48 49 virtual void visit( LogicalExpr * ); -
src/driver/cfa.cc
r3aba311 r37218fc 10 10 // Created On : Tue Aug 20 13:44:49 2002 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jan 28 18:24:06201613 // Update Count : 1 2712 // Last Modified On : Wed Apr 6 14:04:22 2016 13 // Update Count : 132 14 14 // 15 15 … … 165 165 nargs += 1; 166 166 } else if ( prefix( arg, "-std=" ) ) { 167 std_flag = true; // std=XX provided167 std_flag = true; // -std=XX provided 168 168 args[nargs] = argv[i]; // pass the argument along 169 169 nargs += 1; … … 307 307 nargs += 1; 308 308 if ( ! std_flag ) { // default c99, if none specified 309 args[nargs] = "-std= c99";309 args[nargs] = "-std=gnu99"; 310 310 nargs += 1; 311 311 } // if -
src/libcfa/Makefile.am
r3aba311 r37218fc 11 11 ## Created On : Sun May 31 08:54:01 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Wed Mar 2 22:59:23201614 ## Update Count : 1 1913 ## Last Modified On : Wed Apr 6 21:10:44 2016 14 ## Update Count : 123 15 15 ############################################################################### 16 16 … … 60 60 ${CC} ${CFLAGS} -c -o $@ $< 61 61 62 libs = stdlib iostream fstream iterator62 libs = limits stdlib iostream fstream iterator rational 63 63 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 64 64 65 cheaders = # 66 cfaheaders = limits65 cheaders = # expat 66 cfaheaders = # limits 67 67 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders} 68 68 -
src/libcfa/Makefile.in
r3aba311 r37218fc 83 83 libcfa_a_AR = $(AR) $(ARFLAGS) 84 84 libcfa_a_LIBADD = 85 am__objects_1 = stdlib.$(OBJEXT) iostream.$(OBJEXT) fstream.$(OBJEXT) \86 iterator.$(OBJEXT)85 am__objects_1 = limits.$(OBJEXT) stdlib.$(OBJEXT) iostream.$(OBJEXT) \ 86 fstream.$(OBJEXT) iterator.$(OBJEXT) rational.$(OBJEXT) 87 87 am_libcfa_a_OBJECTS = libcfa-prelude.$(OBJEXT) $(am__objects_1) 88 88 libcfa_a_OBJECTS = $(am_libcfa_a_OBJECTS) … … 213 213 MAINTAINERCLEANFILES = ${addprefix ${libdir}/,${cfalib_DATA}} \ 214 214 ${addprefix ${libdir}/,${lib_LIBRARIES}} ${includedir}/* 215 libs = stdlib iostream fstream iterator215 libs = limits stdlib iostream fstream iterator rational 216 216 libcfa_a_SOURCES = libcfa-prelude.c ${libs:=.c} 217 cheaders = # 218 cfaheaders = limits217 cheaders = # expat 218 cfaheaders = # limits 219 219 include_HEADERS = ${cheaders:=.h} ${libs} ${cfaheaders} 220 220 all: all-am … … 297 297 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iterator.Po@am__quote@ 298 298 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcfa-prelude.Po@am__quote@ 299 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/limits.Po@am__quote@ 300 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rational.Po@am__quote@ 299 301 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stdlib.Po@am__quote@ 300 302 -
src/libcfa/fstream
r3aba311 r37218fc 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 15:08:14201613 // Update Count : 7812 // Last Modified On : Tue Apr 5 22:37:12 2016 13 // Update Count : 82 14 14 // 15 15 … … 20 20 21 21 enum { separateSize = 16 }; 22 struct ofstream { void *file; int separate; char separator[separateSize]; }; 22 struct ofstream { 23 void *file; 24 _Bool sepDefault; 25 _Bool sepOnOff; 26 char separator[separateSize]; 27 }; // ofstream 23 28 24 29 _Bool sepPrt( ofstream * ); 25 30 void sepOn( ofstream * ); 26 31 void sepOff( ofstream * ); 32 void sepReset( ofstream * ); 33 void sepReset( ofstream *, _Bool ); 27 34 void sepSet( ofstream *, const char * ); 28 35 const char * sepGet( ofstream * ); 29 voidsepDisable( ofstream * );30 voidsepEnable( ofstream * );36 _Bool sepDisable( ofstream * ); 37 _Bool sepEnable( ofstream * ); 31 38 int fail( ofstream * ); 32 39 int flush( ofstream * ); … … 39 46 40 47 // implement context istream 41 struct ifstream { void *file; }; 48 struct ifstream { 49 void *file; 50 }; // ifstream 42 51 43 52 int fail( ifstream * is ); -
src/libcfa/fstream.c
r3aba311 r37218fc 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Feb 29 18:41:10201613 // Update Count : 1 6212 // Last Modified On : Wed Apr 6 17:55:27 2016 13 // Update Count : 176 14 14 // 15 15 … … 25 25 } 26 26 27 #define IO_MSG "I/O error "27 #define IO_MSG "I/O error: " 28 28 29 _Bool sepPrt( ofstream * os ) { return os->separate == 1; } 30 void sepOn( ofstream * os ) { if ( os->separate != 2 ) os->separate = 1; } 31 void sepOff( ofstream * os ) { if ( os->separate != 2 ) os->separate = 0; } 29 _Bool sepPrt( ofstream * os ) { return os->sepOnOff; } 30 void sepOn( ofstream * os ) { os->sepOnOff = 1; } 31 void sepOff( ofstream * os ) { os->sepOnOff = 0; } 32 void sepReset( ofstream * os ) { os->sepOnOff = os->sepDefault; } 33 void sepReset( ofstream * os, _Bool reset ) { os->sepDefault = reset; os->sepOnOff = os->sepDefault; } 32 34 void sepSet( ofstream * os, const char * s ) { 33 35 strncpy( &(os->separator[0]), s, separateSize - 1 ); … … 35 37 } // sepSet 36 38 const char * sepGet( ofstream * os ) { return &(os->separator[0]); } 37 void sepDisable( ofstream *os ) { os->separate = 2; } 38 void sepEnable( ofstream *os ) { os->separate = 0; } 39 _Bool sepDisable( ofstream *os ) { 40 _Bool temp = os->sepDefault; 41 os->sepDefault = 0; 42 sepReset( os ); 43 return temp; 44 } // sepDisable 45 _Bool sepEnable( ofstream *os ) { 46 _Bool temp = os->sepDefault; 47 os->sepDefault = 1; 48 sepReset( os ); 49 return temp; 50 } // sepEnable 39 51 40 52 int fail( ofstream * os ) { … … 49 61 FILE *file = fopen( name, mode ); 50 62 if ( file == 0 ) { // do not change unless successful 51 perror( IO_MSG "open output" ); 63 fprintf( stderr, IO_MSG "open output file \"%s\", ", name ); 64 perror( 0 ); 52 65 exit( EXIT_FAILURE ); 53 66 } // if … … 94 107 95 108 96 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 0, { ' ', '\0' } };109 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 1, 0, { ' ', '\0' } }; 97 110 ofstream *sout = &soutFile; 98 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 0, { ' ', '\0' } };111 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 1, 0, { ' ', '\0' } }; 99 112 ofstream *serr = &serrFile; 100 113 … … 114 127 FILE *t = fopen( name, mode ); 115 128 if ( t == 0 ) { // do not change unless successful 116 perror( IO_MSG "open input" ); 129 fprintf( stderr, IO_MSG "open input file \"%s\", ", name ); 130 perror( 0 ); 117 131 exit( EXIT_FAILURE ); 118 132 } // if … … 175 189 // Local Variables: // 176 190 // tab-width: 4 // 177 // compile-command: "cfa fstream.c" //178 191 // End: // -
src/libcfa/iostream
r3aba311 r37218fc 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 2 18:05:27 201613 // Update Count : 8512 // Last Modified On : Tue Apr 5 22:32:37 2016 13 // Update Count : 90 14 14 // 15 15 … … 23 23 void sepOn( ostype * ); 24 24 void sepOff( ostype * ); 25 void sepReset( ostype * ); 26 void sepReset( ostype *, _Bool ); 25 27 void sepSet( ostype *, const char * ); 26 28 const char * sepGet( ostype * ); 27 voidsepDisable( ostype * );28 voidsepEnable( ostype * );29 _Bool sepDisable( ostype * ); 30 _Bool sepEnable( ostype * ); 29 31 int fail( ostype * ); 30 32 int flush( ostype * ); … … 67 69 forall( dtype ostype | ostream( ostype ) ) ostype * sepOn( ostype * ); 68 70 forall( dtype ostype | ostream( ostype ) ) ostype * sepOff( ostype * ); 71 forall( dtype ostype | ostream( ostype ) ) ostype * sepDisable( ostype * ); 72 forall( dtype ostype | ostream( ostype ) ) ostype * sepEnable( ostype * ); 69 73 70 74 // writes the range [begin, end) to the given stream … … 110 114 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, long double _Complex * ); 111 115 112 struct _Istream_ str1{ char * s; };113 _Istream_ str1str( char * );114 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_ str1);116 struct _Istream_cstrUC { char * s; }; 117 _Istream_cstrUC cstr( char * ); 118 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrUC ); 115 119 116 struct _Istream_ str2{ char * s; int size; };117 _Istream_ str2str( char *, int size );118 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_ str2);120 struct _Istream_cstrC { char * s; int size; }; 121 _Istream_cstrC cstr( char *, int size ); 122 forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, _Istream_cstrC ); 119 123 120 124 #endif // __IOSTREAM_H__ -
src/libcfa/iostream.c
r3aba311 r37218fc 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Mar 7 13:51:23201613 // Update Count : 2 2712 // Last Modified On : Wed Apr 6 16:13:29 2016 13 // Update Count : 278 14 14 // 15 15 … … 27 27 ostype * ?|?( ostype *os, char c ) { 28 28 prtfmt( os, "%c", c ); 29 sepOff( os ); 29 30 return os; 30 31 } // ?|? … … 32 33 forall( dtype ostype | ostream( ostype ) ) 33 34 ostype * ?|?( ostype *os, short int si ) { 34 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 35 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 36 sepReset( os ); 35 37 prtfmt( os, "%hd", si ); 36 38 return os; … … 39 41 forall( dtype ostype | ostream( ostype ) ) 40 42 ostype * ?|?( ostype *os, unsigned short int usi ) { 41 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 43 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 44 sepReset( os ); 42 45 prtfmt( os, "%hu", usi ); 43 46 return os; … … 46 49 forall( dtype ostype | ostream( ostype ) ) 47 50 ostype * ?|?( ostype *os, int i ) { 48 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 51 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 52 sepReset( os ); 49 53 prtfmt( os, "%d", i ); 50 54 return os; … … 53 57 forall( dtype ostype | ostream( ostype ) ) 54 58 ostype * ?|?( ostype *os, unsigned int ui ) { 55 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 59 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 60 sepReset( os ); 56 61 prtfmt( os, "%u", ui ); 57 62 return os; … … 60 65 forall( dtype ostype | ostream( ostype ) ) 61 66 ostype * ?|?( ostype *os, long int li ) { 62 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 67 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 68 sepReset( os ); 63 69 prtfmt( os, "%ld", li ); 64 70 return os; … … 67 73 forall( dtype ostype | ostream( ostype ) ) 68 74 ostype * ?|?( ostype *os, unsigned long int uli ) { 69 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 75 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 76 sepReset( os ); 70 77 prtfmt( os, "%lu", uli ); 71 78 return os; … … 74 81 forall( dtype ostype | ostream( ostype ) ) 75 82 ostype * ?|?( ostype *os, long long int lli ) { 76 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 83 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 84 sepReset( os ); 77 85 prtfmt( os, "%lld", lli ); 78 86 return os; … … 81 89 forall( dtype ostype | ostream( ostype ) ) 82 90 ostype * ?|?( ostype *os, unsigned long long int ulli ) { 83 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 91 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 92 sepReset( os ); 84 93 prtfmt( os, "%llu", ulli ); 85 94 return os; … … 88 97 forall( dtype ostype | ostream( ostype ) ) 89 98 ostype * ?|?( ostype *os, float f ) { 90 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 99 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 100 sepReset( os ); 91 101 prtfmt( os, "%g", f ); 92 102 return os; … … 95 105 forall( dtype ostype | ostream( ostype ) ) 96 106 ostype * ?|?( ostype *os, double d ) { 97 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 107 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 108 sepReset( os ); 98 109 prtfmt( os, "%.*lg", DBL_DIG, d ); 99 110 return os; … … 102 113 forall( dtype ostype | ostream( ostype ) ) 103 114 ostype * ?|?( ostype *os, long double ld ) { 104 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 115 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 116 sepReset( os ); 105 117 prtfmt( os, "%.*Lg", LDBL_DIG, ld ); 106 118 return os; … … 110 122 ostype * ?|?( ostype *os, float _Complex fc ) { 111 123 os | crealf( fc ); 112 if ( cimagf( fc ) >= 0 ) os | '+'; 113 os | "" | cimagf( fc ) | 'i'; 124 _Bool temp = sepDisable( os ); // disable separators within complex value 125 if ( cimagf( fc ) >= 0 ) os | '+'; // negative value prints '-' 126 os | cimagf( fc ) | 'i'; 127 sepReset( os, temp ); // reset separator 114 128 return os; 115 129 } // ?|? … … 118 132 ostype * ?|?( ostype *os, double _Complex dc ) { 119 133 os | creal( dc ); 120 if ( cimag( dc ) >= 0 ) os | '+'; 121 os | "" | cimag( dc ) | 'i'; 134 _Bool temp = sepDisable( os ); // disable separators within complex value 135 if ( cimag( dc ) >= 0 ) os | '+'; // negative value prints '-' 136 os | cimag( dc ) | 'i'; 137 sepReset( os, temp ); // reset separator 122 138 return os; 123 139 } // ?|? … … 126 142 ostype * ?|?( ostype *os, long double _Complex ldc ) { 127 143 os | creall( ldc ); 128 if ( cimagl( ldc ) >= 0 ) os | '+'; 129 os | "" | cimagl( ldc ) | 'i'; 144 _Bool temp = sepDisable( os ); // disable separators within complex value 145 if ( cimagl( ldc ) >= 0 ) os | '+'; // negative value prints '-' 146 os | cimagl( ldc ) | 'i'; 147 sepReset( os, temp ); // reset separator 130 148 return os; 131 149 } // ?|? … … 134 152 ostype * ?|?( ostype *os, const char *cp ) { 135 153 enum { Open = 1, Close, OpenClose }; 136 static const char mask[256] = {154 static const unsigned char mask[256] = { 137 155 // opening delimiters 138 156 ['('] : Open, ['['] : Open, ['{'] : Open, 139 ['$'] : Open, [ L'£'] : Open, [L'¥'] : Open, [L'¢'] : Open, [L'¿'] : Open, [L'«'] : Open,157 ['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open, 140 158 // closing delimiters 141 159 [','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close, 142 160 [')'] : Close, [']'] : Close, ['}'] : Close, 143 ['%'] : Close, [ L'»'] : Close,161 ['%'] : Close, [(unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close, 144 162 // opening-closing delimiters 145 163 ['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose, 164 ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace 146 165 }; // mask 147 166 … … 149 168 // null string => no separator 150 169 if ( len == 0 ) { sepOff( os ); return os; } 151 // first character NOT spacing or closing punctuation => add left separator 152 if ( sepPrt( os ) && isspace( cp[0] ) == 0 && mask[ cp[0] ] != Close && mask[ cp[0] ] != OpenClose ) { 170 // first character IS NOT spacing or closing punctuation => add left separator 171 unsigned char ch = cp[0]; // must make unsigned 172 if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) { 153 173 prtfmt( os, "%s", sepGet( os ) ); 154 174 } // if 155 175 // last character IS spacing or opening punctuation => turn off separator for next item 156 176 unsigned int posn = len - 1; 157 if ( isspace( cp[posn] ) || mask[ cp[posn] ] == Open || mask[ cp[posn] ] == OpenClose ) { 177 ch = cp[posn]; // must make unsigned 178 if ( mask[ ch ] == Open || mask[ ch ] == OpenClose ) { 158 179 sepOff( os ); 159 180 } else { … … 165 186 forall( dtype ostype | ostream( ostype ) ) 166 187 ostype * ?|?( ostype *os, const void *p ) { 167 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); else sepOn( os ); 188 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 189 sepReset( os ); 168 190 prtfmt( os, "%p", p ); 169 191 return os; … … 196 218 } // sepOff 197 219 220 forall( dtype ostype | ostream( ostype ) ) 221 ostype * sepEnable( ostype * os ) { 222 sepEnable( os ); 223 return os; 224 } // sepEnable 225 226 forall( dtype ostype | ostream( ostype ) ) 227 ostype * sepDisable( ostype * os ) { 228 sepDisable( os ); 229 return os; 230 } // sepDisable 231 198 232 //--------------------------------------- 199 233 … … 310 344 } // ?|? 311 345 312 _Istream_ str1 str( char * s ) { _Istream_str1s = { s }; return s; }313 forall( dtype istype | istream( istype ) ) 314 istype * ?|?( istype * is, _Istream_ str1str ) {315 scanfmt( is, "%s", str.s );316 return is; 317 } // str318 319 _Istream_ str2 str( char * s, int size ) { _Istream_str2s = { s, size }; return s; }320 forall( dtype istype | istream( istype ) ) 321 istype * ?|?( istype * is, _Istream_ str2str ) {346 _Istream_cstrUC cstr( char * s ) { _Istream_cstrUC s = { s }; return s; } 347 forall( dtype istype | istream( istype ) ) 348 istype * ?|?( istype * is, _Istream_cstrUC cstr ) { 349 scanfmt( is, "%s", cstr.s ); 350 return is; 351 } // cstr 352 353 _Istream_cstrC cstr( char * s, int size ) { _Istream_cstrC s = { s, size }; return s; } 354 forall( dtype istype | istream( istype ) ) 355 istype * ?|?( istype * is, _Istream_cstrC cstr ) { 322 356 char buf[16]; 323 sprintf( buf, "%%%ds", str.size );324 scanfmt( is, buf, str.s );325 return is; 326 } // str357 sprintf( buf, "%%%ds", cstr.size ); 358 scanfmt( is, buf, cstr.s ); 359 return is; 360 } // cstr 327 361 328 362 // Local Variables: // -
src/libcfa/limits
r3aba311 r37218fc 1 // 2 // Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo 3 // 4 // The contents of this file are covered under the licence agreement in the 5 // file "LICENCE" distributed with Cforall. 6 // 7 // limits -- 8 // 9 // Author : Peter A. Buhr 10 // Created On : Wed Apr 6 18:06:52 2016 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Apr 6 21:08:16 2016 13 // Update Count : 6 14 // 15 1 16 // Integral Constants 2 17 3 const short int MIN = -32768;4 const int MIN = -2147483648;5 const long int MIN = -9223372036854775807L - 1L;6 const long long int MIN = -9223372036854775807LL - 1LL;18 extern const short int MIN; 19 extern const int MIN; 20 extern const long int MIN; 21 extern const long long int MIN; 7 22 8 const short int MAX = 32767;9 const unsigned short int MAX = 65535;10 const int MAX = 2147483647;11 const unsigned int MAX = 4294967295_U;12 const long int MAX = 9223372036854775807_L;13 const unsigned long int MAX = 4294967295_U;14 const long long int MAX = 9223372036854775807_LL;15 const unsigned long long int MAX = 18446744073709551615_ULL;23 extern const short int MAX; 24 extern const unsigned short int MAX; 25 extern const int MAX; 26 extern const unsigned int MAX; 27 extern const long int MAX; 28 extern const unsigned long int MAX; 29 extern const long long int MAX; 30 extern const unsigned long long int MAX; 16 31 17 32 // Floating-Point Constants 18 33 19 const float PI = 3.141592_F;// pi20 const float PI_2 = 1.570796_F;// pi / 221 const float PI_4 = 0.7853981_F;// pi / 422 const float _1_PI = 0.3183098_F;// 1 / pi23 const float _2_PI = 0.6366197_F;// 2 / pi24 const float _2_SQRT_PI = 1.128379_F;// 2 / sqrt(pi)34 extern const float PI; // pi 35 extern const float PI_2; // pi / 2 36 extern const float PI_4; // pi / 4 37 extern const float _1_PI; // 1 / pi 38 extern const float _2_PI; // 2 / pi 39 extern const float _2_SQRT_PI; // 2 / sqrt(pi) 25 40 26 const double PI = 3.14159265358979323846_D;// pi27 const double PI_2 = 1.57079632679489661923_D;// pi / 228 const double PI_4 = 0.78539816339744830962_D;// pi / 429 const double _1_PI = 0.31830988618379067154_D;// 1 / pi30 const double _2_PI = 0.63661977236758134308_D;// 2 / pi31 const double _2_SQRT_PI = 1.12837916709551257390_D;// 2 / sqrt(pi)41 extern const double PI; // pi 42 extern const double PI_2; // pi / 2 43 extern const double PI_4; // pi / 4 44 extern const double _1_PI; // 1 / pi 45 extern const double _2_PI; // 2 / pi 46 extern const double _2_SQRT_PI; // 2 / sqrt(pi) 32 47 33 const long double PI = 3.1415926535897932384626433832795029_DL;// pi34 const long double PI_2 = 1.5707963267948966192313216916397514_DL;// pi / 235 const long double PI_4 = 0.7853981633974483096156608458198757_DL;// pi / 436 const long double _1_PI = 0.3183098861837906715377675267450287_DL;// 1 / pi37 const long double _2_PI = 0.6366197723675813430755350534900574_DL;// 2 / pi38 const long double _2_SQRT_PI = 1.1283791670955125738961589031215452_DL;// 2 / sqrt(pi)48 extern const long double PI; // pi 49 extern const long double PI_2; // pi / 2 50 extern const long double PI_4; // pi / 4 51 extern const long double _1_PI; // 1 / pi 52 extern const long double _2_PI; // 2 / pi 53 extern const long double _2_SQRT_PI; // 2 / sqrt(pi) 39 54 40 const _Complex PI = 3.14159265358979323846_D+0.0_iD;// pi41 const _Complex PI_2 = 1.57079632679489661923_D+0.0_iD;// pi / 242 const _Complex PI_4 = 0.78539816339744830962_D+0.0_iD;// pi / 443 const _Complex _1_PI = 0.31830988618379067154_D+0.0_iD;// 1 / pi44 const _Complex _2_PI = 0.63661977236758134308_D+0.0_iD;// 2 / pi45 const _Complex _2_SQRT_PI = 1.12837916709551257390_D+0.0_iD;// 2 / sqrt(pi)55 extern const _Complex PI; // pi 56 extern const _Complex PI_2; // pi / 2 57 extern const _Complex PI_4; // pi / 4 58 extern const _Complex _1_PI; // 1 / pi 59 extern const _Complex _2_PI; // 2 / pi 60 extern const _Complex _2_SQRT_PI; // 2 / sqrt(pi) 46 61 47 const long _Complex PI = 3.1415926535897932384626433832795029_L+0.0iL;// pi48 const long _Complex PI_2 = 1.5707963267948966192313216916397514_L+0.0iL;// pi / 249 const long _Complex PI_4 = 0.7853981633974483096156608458198757_L+0.0iL;// pi / 450 const long _Complex _1_PI = 0.3183098861837906715377675267450287_L+0.0iL;// 1 / pi51 const long _Complex _2_PI = 0.6366197723675813430755350534900574_L+0.0iL;// 2 / pi52 const long _Complex _2_SQRT_PI = 1.1283791670955125738961589031215452_L+0.0iL;// 2 / sqrt(pi)62 extern const long _Complex PI; // pi 63 extern const long _Complex PI_2; // pi / 2 64 extern const long _Complex PI_4; // pi / 4 65 extern const long _Complex _1_PI; // 1 / pi 66 extern const long _Complex _2_PI; // 2 / pi 67 extern const long _Complex _2_SQRT_PI; // 2 / sqrt(pi) 53 68 54 const float E = 2.718281;// e55 const float LOG2_E = 1.442695;// log_2(e)56 const float LOG10_E = 0.4342944;// log_10(e)57 const float LN_2 = 0.6931471;// log_e(2)58 const float LN_10 = 2.302585;// log_e(10)59 const float SQRT_2 = 1.414213;// sqrt(2)60 const float _1_SQRT_2 = 0.7071067;// 1 / sqrt(2)69 extern const float E; // e 70 extern const float LOG2_E; // log_2(e) 71 extern const float LOG10_E; // log_10(e) 72 extern const float LN_2; // log_e(2) 73 extern const float LN_10; // log_e(10) 74 extern const float SQRT_2; // sqrt(2) 75 extern const float _1_SQRT_2; // 1 / sqrt(2) 61 76 62 const double E = 2.7182818284590452354_D;// e63 const double LOG2_E = 1.4426950408889634074_D;// log_2(e)64 const double LOG10_E = 0.43429448190325182765_D;// log_10(e)65 const double LN_2 = 0.69314718055994530942_D;// log_e(2)66 const double LN_10 = 2.30258509299404568402_D;// log_e(10)67 const double SQRT_2 = 1.41421356237309504880_D;// sqrt(2)68 const double _1_SQRT_2 = 0.70710678118654752440_D;// 1 / sqrt(2)77 extern const double E; // e 78 extern const double LOG2_E; // log_2(e) 79 extern const double LOG10_E; // log_10(e) 80 extern const double LN_2; // log_e(2) 81 extern const double LN_10; // log_e(10) 82 extern const double SQRT_2; // sqrt(2) 83 extern const double _1_SQRT_2; // 1 / sqrt(2) 69 84 70 const long double E = 2.7182818284590452353602874713526625_DL;// e71 const long double LOG2_E = 1.4426950408889634073599246810018921_DL;// log_2(e)72 const long double LOG10_E = 0.4342944819032518276511289189166051_DL;// log_10(e)73 const long double LN_2 = 0.6931471805599453094172321214581766_DL;// log_e(2)74 const long double LN_10 = 2.3025850929940456840179914546843642_DL;// log_e(10)75 const long double SQRT_2 = 1.4142135623730950488016887242096981_DL;// sqrt(2)76 const long double _1_SQRT_2 = 0.7071067811865475244008443621048490_DL;// 1/sqrt(2)85 extern const long double E; // e 86 extern const long double LOG2_E; // log_2(e) 87 extern const long double LOG10_E; // log_10(e) 88 extern const long double LN_2; // log_e(2) 89 extern const long double LN_10; // log_e(10) 90 extern const long double SQRT_2; // sqrt(2) 91 extern const long double _1_SQRT_2; // 1/sqrt(2) 77 92 78 const _Complex E = 2.7182818284590452354_D+0.0_iD;// e79 const _Complex LOG2_E = 1.4426950408889634074_D+0.0_iD;// log_2(e)80 const _Complex LOG10_E = 0.43429448190325182765_D+0.0_iD;// log_10(e)81 const _Complex LN_2 = 0.69314718055994530942_D+0.0_iD;// log_e(2)82 const _Complex LN_10 = 2.30258509299404568402_D+0.0_iD;// log_e(10)83 const _Complex SQRT_2 = 1.41421356237309504880_D+0.0_iD;// sqrt(2)84 const _Complex _1_SQRT_2 = 0.70710678118654752440_D+0.0_iD;// 1 / sqrt(2)93 extern const _Complex E; // e 94 extern const _Complex LOG2_E; // log_2(e) 95 extern const _Complex LOG10_E; // log_10(e) 96 extern const _Complex LN_2; // log_e(2) 97 extern const _Complex LN_10; // log_e(10) 98 extern const _Complex SQRT_2; // sqrt(2) 99 extern const _Complex _1_SQRT_2; // 1 / sqrt(2) 85 100 86 const long _Complex E = 2.7182818284590452353602874713526625_L+0.0_iL; // e 87 const long _Complex LOG2_E = 1.4426950408889634073599246810018921_L+0.0_iL; // log_2(e) 88 const long _Complex LOG10_E = 0.4342944819032518276511289189166051_L+0.0_iL; // log_10(e) 89 const long _Complex LN_2 = 0.6931471805599453094172321214581766_L+0.0_iL; // log_e(2) 90 const long _Complex LN_10 = 2.3025850929940456840179914546843642_L+0.0_iL; // log_e(10) 91 const long _Complex SQRT_2 = 1.4142135623730950488016887242096981_L+0.0_iL; // sqrt(2) 92 const long _Complex _1_SQRT_2 = 0.7071067811865475244008443621048490_L+0.0_iL; // 1 / sqrt(2) 101 extern const long _Complex E; // e 102 extern const long _Complex LOG2_E; // log_2(e) 103 extern const long _Complex LOG10_E; // log_10(e) 104 extern const long _Complex LN_2; // log_e(2) 105 extern const long _Complex LN_10; // log_e(10) 106 extern const long _Complex SQRT_2; // sqrt(2) 107 extern const long _Complex _1_SQRT_2; // 1 / sqrt(2) 108 109 // Local Variables: // 110 // mode: c // 111 // tab-width: 4 // 112 // End: // -
src/libcfa/stdlib
r3aba311 r37218fc 10 10 // Created On : Thu Jan 28 17:12:35 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Mar 22 22:34:24 201613 // Update Count : 6912 // Last Modified On : Fri Apr 1 22:26:14 2016 13 // Update Count : 73 14 14 // 15 15 … … 18 18 extern "C" { 19 19 #include <stddef.h> // size_t 20 #include <math.h> // floor 20 21 } // extern "C" 21 22 … … 80 81 char abs( char ); 81 82 extern "C" { 82 int abs( int ); // use default C routine for int83 } // extern 83 int abs( int ); // use default C routine for int 84 } // extern "C" 84 85 long int abs( long int ); 85 86 long long int abs( long long int ); … … 90 91 double _Complex abs( double _Complex ); 91 92 long double _Complex abs( long double _Complex ); 93 94 //--------------------------------------- 95 96 float floor( float ); 97 extern "C" { 98 double floor( double ); // use C routine for double 99 } // extern "C" 100 long double floor( long double ); 101 102 float ceil( float ); 103 extern "C" { 104 double ceil( double ); // use C routine for double 105 } // extern "C" 106 long double ceil( long double ); 92 107 93 108 //--------------------------------------- -
src/libcfa/stdlib.c
r3aba311 r37218fc 10 10 // Created On : Thu Jan 28 17:10:29 2016 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Mar 23 13:26:42201613 // Update Count : 14 612 // Last Modified On : Wed Mar 30 10:48:41 2016 13 // Update Count : 149 14 14 // 15 15 … … 243 243 //--------------------------------------- 244 244 245 float floor( float v ) { return floorf( v ); } 246 long double floor( long double v ) { return floorl( v ); } 247 248 float ceil( float v ) { return ceilf( v ); } 249 long double ceil( long double v ) { return ceill( v ); } 250 251 //--------------------------------------- 252 245 253 void rand48seed( long int s ) { srand48( s ); } 246 254 char rand48() { return mrand48(); }
Note:
See TracChangeset
for help on using the changeset viewer.