Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 64071c2ad8eac1915b692988a8dc0d8e9d7cb8da)
+++ src/CodeGen/CodeGenerator.cc	(revision 7baed7d624d6fc245ee9ff6f08edb3226adfc288)
@@ -26,4 +26,5 @@
 #include "SynTree/Statement.h"
 #include "SynTree/Type.h"
+#include "SynTree/Attribute.h"
 
 #include "Common/utility.h"
@@ -76,26 +77,24 @@
 	}
 
+	void CodeGenerator::genAttributes( std::list< Attribute * > & attributes ) {
+		if ( ! attributes.empty() ) {
+			output << "__attribute__ ((";
+			for ( Attribute *& attr : attributes ) {
+				if ( ! attr->empty() ) {
+					output << attr->get_name() << "(";
+					genCommaList( attr->get_parameters().begin(), attr->get_parameters().end() );
+					output << ")";
+				}
+				output << ",";
+			}
+			output << ")) ";
+		}
+	}
+
+
 	//*** Declarations
 	void CodeGenerator::visit( FunctionDecl *functionDecl ) {
-		// generalize this
-		FunctionDecl::Attribute attr = functionDecl->get_attribute();
-		switch ( attr.type ) {
-			case FunctionDecl::Attribute::Constructor:
-				output << "__attribute__ ((constructor";
-				if ( attr.priority != FunctionDecl::Attribute::Default ) {
-					output << "(" << attr.priority << ")";
-				}
-				output << ")) ";
-				break;
-			case FunctionDecl::Attribute::Destructor:
-				output << "__attribute__ ((destructor";
-				if ( attr.priority != FunctionDecl::Attribute::Default ) {
-					output << "(" << attr.priority << ")";
-				}
-				output << ")) ";
-				break;
-			default:
-				break;
-		}
+		genAttributes( functionDecl->get_attributes() );
+
 		handleStorageClass( functionDecl );
 		if ( functionDecl->get_isInline() ) {
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 64071c2ad8eac1915b692988a8dc0d8e9d7cb8da)
+++ src/CodeGen/CodeGenerator.h	(revision 7baed7d624d6fc245ee9ff6f08edb3226adfc288)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// CodeGenerator.h -- 
+// CodeGenerator.h --
 //
 // Author           : Richard C. Bilson
@@ -60,5 +60,5 @@
 		virtual void visit( MemberExpr *memberExpr );
 		virtual void visit( VariableExpr *variableExpr );
-		virtual void visit( ConstantExpr *constantExpr ); 
+		virtual void visit( ConstantExpr *constantExpr );
 		virtual void visit( SizeofExpr *sizeofExpr );
 		virtual void visit( AlignofExpr *alignofExpr );
@@ -85,5 +85,7 @@
 		virtual void visit( ForStmt * );
 		virtual void visit( NullStmt * );
-		virtual void visit( DeclStmt * ); 
+		virtual void visit( DeclStmt * );
+
+		void genAttributes( std::list< Attribute * > & attributes );
 
 		template< class Iterator > void genCommaList( Iterator begin, Iterator end );
@@ -108,5 +110,5 @@
 
 	};
-	
+
 	template< class Iterator >
 	void CodeGenerator::genCommaList( Iterator begin, Iterator end ) {
@@ -119,5 +121,5 @@
 		} // for
 	}
-  
+
 	inline bool doSemicolon( Declaration* decl ) {
 		if ( FunctionDecl* func = dynamic_cast< FunctionDecl* >( decl ) ) {
