Hi all,

There are a few libstdc++ that don't fit into memory when the -mcmodel=tiny option is used. For example 25_algorithms/random_shuffle/1.cc on aarch64 is a 5.5M binary on aarch64 with -mcmodel=small.

In the gcc and g++ testsuite we already catch such cases and mark them as UNSUPPORTED. In libstdc++.exp there is no such functionality. This patch adds that check. I've implemented the v3_check_unsupported_p predicate the same way as it's implemented in the gcc testsuite. I'm not very happy that it had to be copied, but I couldn't find a way to include the gcc definition sanely.

With this patch 8 tests that were previously FAILing on aarch64-none-elf/-mcmodel=tiny due to relocation truncation errors are now marked as UNSUPPORTED.

A test run on x86 didn't show any bad behaviour appearing.

Is this a sane approach to what I'm trying to solve?

Thanks,
Kyrill

2014-12-03  Kyrylo Tkachov  kyrylo.tkac...@arm.com\

     * testsuite/lib/libstdc++.exp (${tool}_check_unsupported_p):
     New procedure.
     (v3_target_compile): Check if test is unsupported.
     (v3_target_compile_as_c): Likewise.
diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp
index 3d9913b..385ae07 100644
--- a/libstdc++-v3/testsuite/lib/libstdc++.exp
+++ b/libstdc++-v3/testsuite/lib/libstdc++.exp
@@ -343,6 +343,22 @@ proc libstdc++_exit { } {
     }
 }
 
+proc ${tool}_check_unsupported_p { output } {
+    if [regexp "(^|\n)\[^\n\]*: region \[^\n\]* is full" $output] {
+	return "memory full"
+    }
+    if { [regexp "(^|\n)\[^\n\]*: relocation truncated to fit" $output]
+          && [check_effective_target_tiny] } {
+        return "memory full"
+     }
+
+    if { [istarget spu-*-*] && \
+	     [string match "*exceeds local store*" $output] } {
+	return "memory full"
+    }
+    return ""
+}
+
 # Callback from system dg-test.
 proc libstdc++-dg-test { prog do_what extra_tool_flags } {
     # Set up the compiler flags, based on what we're going to do.
@@ -455,6 +471,7 @@ proc v3_target_compile { source dest type options } {
     global cxxldflags
     global includes
     global STATIC_LIBCXXFLAGS
+    global tool
 
     if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
         lappend options "libs=${gluefile}"
@@ -483,7 +500,14 @@ proc v3_target_compile { source dest type options } {
     lappend options "compiler=$cxx_final"
     lappend options "timeout=[timeout_value]"
 
-    return [target_compile $source $dest $type $options]
+    set comp_output [target_compile $source $dest $type $options]
+    set unsupported_message [${tool}_check_unsupported_p $comp_output]
+
+    if { $unsupported_message != "" } {
+      unsupported "$dest: $unsupported_message"
+      return ""
+    }
+    return $comp_output
 }
 
 
@@ -498,6 +522,7 @@ proc v3_target_compile_as_c { source dest type options } {
     global cc
     global cxxflags
     global STATIC_LIBCXXFLAGS
+    global tool
 
     if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
         lappend options "libs=${gluefile}"
@@ -551,7 +576,14 @@ proc v3_target_compile_as_c { source dest type options } {
     lappend options "compiler=$cc_final"
     lappend options "timeout=[timeout_value]"
 
-    return [target_compile $source $dest $type $options]
+    set comp_output [target_compile $source $dest $type $options]
+    set unsupported_message [${tool}_check_unsupported_p $comp_output]
+
+    if { $unsupported_message != "" } {
+      unsupported "$dest: $unsupported_message"
+      return ""
+    }
+    return $comp_output
 }
 
 # Build the support objects linked in with the libstdc++ tests.  In

Reply via email to