scons: Use c++0x with gcc >= 4.4 instead of 4.6
authorAndreas Hansson <andreas.hansson@arm.com>
Fri, 14 Sep 2012 16:13:18 +0000 (12:13 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Fri, 14 Sep 2012 16:13:18 +0000 (12:13 -0400)
This patch shifts the version of gcc for which we enable c++0x from
4.6 to 4.4 The more long term plan is to see what the c++0x features
can bring and what level of support would be enabled simply by bumping
the required version of gcc from 4.3 to 4.4.

A few minor things had to be fixed in the code base, most notably the
choice of a hashmap implementation. In the Ruby Sequencer there were
also a few minor issues that gcc 4.4 was not too happy about.

SConstruct
src/base/hashmap.hh
src/mem/ruby/system/Sequencer.cc

index 34b333f603d0a452f635a64f421266e0538afdc5..ee53be196f6ca007a141ec6dbf7619dd764d9f74 100755 (executable)
@@ -502,7 +502,9 @@ if main['GCC']:
        not compareVersions(gcc_version, '4.4.2'):
         print 'Info: Tree vectorizer in GCC 4.4.1 & 4.4.2 is buggy, disabling.'
         main.Append(CCFLAGS=['-fno-tree-vectorize'])
-    if compareVersions(gcc_version, '4.6') >= 0:
+    # c++0x support in gcc is useful already from 4.4, see
+    # http://gcc.gnu.org/projects/cxx0x.html for details
+    if compareVersions(gcc_version, '4.4') >= 0:
         main.Append(CXXFLAGS=['-std=c++0x'])
 elif main['ICC']:
     pass #Fix me... add warning flags once we clean up icc warnings
@@ -535,6 +537,8 @@ elif main['CLANG']:
     # of if-statements
     main.Append(CCFLAGS=['-Wno-parentheses'])
 
+    # clang 2.9 does not play well with c++0x as it ships with C++
+    # headers that produce errors, this was fixed in 3.0
     if compareVersions(clang_version, "3") >= 0:
         main.Append(CXXFLAGS=['-std=c++0x'])
 else:
index dfdf6ef904c6018caaf21bb42b0666aa8cc211a6..41de400553b9bee5ed1b02aa372c1536d4517c36 100644 (file)
@@ -50,9 +50,9 @@
 // clang, use unordered_map
 
 // we need to determine what is available, as in the non-c++0x case,
-// e.g. gcc >= 4.3 and <= 4.5, the containers are in the std::tr1
-// namespace, and only gcc >= 4.6 (with -std=c++0x) adds the final
-// container implementation in the std namespace
+// i.e. gcc == 4.3, the containers are in the std::tr1 namespace, and
+// only gcc >= 4.4 (with -std=c++0x) adds the final container
+// implementation in the std namespace
 
 #if defined(__clang__)
 // align with -std=c++0x only for clang >= 3.0 in CCFLAGS and also
@@ -67,9 +67,9 @@
 #define HAVE_STD_TR1_UNORDERED_MAP 1
 #endif
 #else
-// align with -std=c++0x only for gcc >= 4.6 in CCFLAGS, contrary to
+// align with -std=c++0x only for gcc >= 4.4 in CCFLAGS, contrary to
 // clang we can rely entirely on the compiler version
-#if ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || __GNUC__ > 4)
+#if ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4)
 #define HAVE_STD_UNORDERED_MAP 1
 #else
 #define HAVE_STD_TR1_UNORDERED_MAP 1
 
 #if HAVE_STD_UNORDERED_MAP
 
-// clang or gcc >= 4.6
+// clang or gcc >= 4.4
 #include <unordered_map>
 #include <unordered_set>
 // note that this assumes that -std=c++0x is added to the command line
-// which is done in the SConstruct CXXFLAGS for gcc >= 4.6 and clang
+// which is done in the SConstruct CXXFLAGS for gcc >= 4.4 and clang
 // >= 3.0
 #define __hash_namespace std
 #define __hash_namespace_begin namespace std {
 #define __hash_namespace_end }
 #else
-// clang <= 3.0, gcc >= 4.3 and < 4.6
+// clang <= 3.0, gcc == 4.3
 #include <tr1/unordered_map>
 #include <tr1/unordered_set>
 #define __hash_namespace std::tr1
index efb0b002ea603bd680ec77b08eaaa610812bb2e8..854d360ac930beeda1429847dc9e735b7c42b1c8 100644 (file)
@@ -214,6 +214,11 @@ Sequencer::insertRequest(PacketPtr pkt, RubyRequestType request_type)
 
     Address line_addr(pkt->getAddr());
     line_addr.makeLineAddress();
+    // Create a default entry, mapping the address to NULL, the cast is
+    // there to make gcc 4.4 happy
+    RequestTable::value_type default_entry(line_addr,
+                                           (SequencerRequest*) NULL);
+
     if ((request_type == RubyRequestType_ST) ||
         (request_type == RubyRequestType_RMW_Read) ||
         (request_type == RubyRequestType_RMW_Write) ||
@@ -231,7 +236,7 @@ Sequencer::insertRequest(PacketPtr pkt, RubyRequestType request_type)
         }
 
         pair<RequestTable::iterator, bool> r =
-            m_writeRequestTable.insert(RequestTable::value_type(line_addr, 0));
+            m_writeRequestTable.insert(default_entry);
         if (r.second) {
             RequestTable::iterator i = r.first;
             i->second = new SequencerRequest(pkt, request_type,
@@ -251,7 +256,7 @@ Sequencer::insertRequest(PacketPtr pkt, RubyRequestType request_type)
         }
 
         pair<RequestTable::iterator, bool> r =
-            m_readRequestTable.insert(RequestTable::value_type(line_addr, 0));
+            m_readRequestTable.insert(default_entry);
 
         if (r.second) {
             RequestTable::iterator i = r.first;