Simplified the way Cachegrind configures the caches;  it was really
strange before.  Also aborting if any command-line-provided cache
configuration is unacceptable, rather than falling back on defaults;
it's simpler and arguably better than just emitting a warning.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3118 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/cachegrind/cg_arch.h b/cachegrind/cg_arch.h
index 71ed2bd..c12e0d9 100644
--- a/cachegrind/cg_arch.h
+++ b/cachegrind/cg_arch.h
@@ -38,9 +38,10 @@
     int line_size;  // bytes
 } cache_t;
 
+// Gives the configuration of I1, D1 and L2 caches.  They get overridden
+// by any cache configurations specified on the command line.
 void VGA_(configure_caches)(cache_t* I1c, cache_t* D1c, cache_t* L2c,
-                         cache_t* I1_dflt, cache_t* D1_dflt, cache_t* L2_dflt,
-                         Bool all_caches_clo_defined);
+                            Bool all_caches_clo_defined);
 
 #endif   // __CG_ARCH_H
 
diff --git a/cachegrind/cg_main.c b/cachegrind/cg_main.c
index 90cf31e..5f370fc 100644
--- a/cachegrind/cg_main.c
+++ b/cachegrind/cg_main.c
@@ -679,29 +679,28 @@
 
 /* Checks cache config is ok;  makes it so if not. */
 static 
-void check_cache(cache_t* cache, cache_t* dflt, Char *name)
+void check_cache(cache_t* cache, Char *name)
 {
    /* First check they're all powers of two */
    if (-1 == VG_(log2)(cache->size)) {
       VG_(message)(Vg_UserMsg,
-         "warning: %s size of %dB not a power of two; "
-         "defaulting to %dB", name, cache->size, dflt->size);
-      cache->size = dflt->size;
+         "error: %s size of %dB not a power of two; aborting.",
+         name, cache->size);
+      VG_(exit)(1);
    }
 
    if (-1 == VG_(log2)(cache->assoc)) {
       VG_(message)(Vg_UserMsg,
-         "warning: %s associativity of %d not a power of two; "
-         "defaulting to %d-way", name, cache->assoc, dflt->assoc);
-      cache->assoc = dflt->assoc;
+         "error: %s associativity of %d not a power of two; aborting.",
+         name, cache->assoc);
+      VG_(exit)(1);
    }
 
    if (-1 == VG_(log2)(cache->line_size)) {
       VG_(message)(Vg_UserMsg,
-         "warning: %s line size of %dB not a power of two; "
-         "defaulting to %dB", 
-         name, cache->line_size, dflt->line_size);
-      cache->line_size = dflt->line_size;
+         "error: %s line size of %dB not a power of two; aborting.",
+         name, cache->line_size);
+      VG_(exit)(1);
    }
 
    /* Then check line size >= 16 -- any smaller and a single instruction could
@@ -709,27 +708,24 @@
     * stupid anyway. */
    if (cache->line_size < MIN_LINE_SIZE) {
       VG_(message)(Vg_UserMsg,
-         "warning: %s line size of %dB too small; "
-         "increasing to %dB", name, cache->line_size, MIN_LINE_SIZE);
-      cache->line_size = MIN_LINE_SIZE;
+         "error: %s line size of %dB too small; aborting.", 
+         name, cache->line_size);
+      VG_(exit)(1);
    }
 
    /* Then check cache size > line size (causes seg faults if not). */
    if (cache->size <= cache->line_size) {
       VG_(message)(Vg_UserMsg,
-         "warning: %s cache size of %dB <= line size of %dB; "
-         "increasing to %dB", name, cache->size, cache->line_size,
-                              cache->line_size * 2);
-      cache->size = cache->line_size * 2;
+         "error: %s cache size of %dB <= line size of %dB; aborting.",
+         name, cache->size, cache->line_size);
+      VG_(exit)(1);
    }
 
    /* Then check assoc <= (size / line size) (seg faults otherwise). */
    if (cache->assoc > (cache->size / cache->line_size)) {
       VG_(message)(Vg_UserMsg,
-         "warning: %s associativity > (size / line size); "
-         "increasing size to %dB", 
-            name, cache->assoc * cache->line_size);
-      cache->size = cache->assoc * cache->line_size;
+         "warning: %s associativity > (size / line size); aborting.", name);
+      VG_(exit)(1);
    }
 }
 
@@ -739,17 +735,15 @@
 #define DEFINED(L)   (-1 != L.size  || -1 != L.assoc || -1 != L.line_size)
 
    Int n_clos = 0;
-   cache_t I1_dflt, D1_dflt, L2_dflt;
 
    // Count how many were defined on the command line.
    if (DEFINED(clo_I1_cache)) { n_clos++; }
    if (DEFINED(clo_D1_cache)) { n_clos++; }
    if (DEFINED(clo_L2_cache)) { n_clos++; }
 
-   // Set the default cache config (using auto-detection, if supported by
-   // current arch)
-   VGA_(configure_caches)( I1c, D1c, L2c, &I1_dflt, &D1_dflt, &L2_dflt,
-                           (3 == n_clos) );
+   // Set the cache config (using auto-detection, if supported by the
+   // architecture)
+   VGA_(configure_caches)( I1c, D1c, L2c, (3 == n_clos) );
 
    // Then replace with any defined on the command line.
    if (DEFINED(clo_I1_cache)) { *I1c = clo_I1_cache; }
@@ -757,9 +751,9 @@
    if (DEFINED(clo_L2_cache)) { *L2c = clo_L2_cache; }
 
    // Then check values and fix if not acceptable.
-   check_cache(I1c, &I1_dflt, "I1");
-   check_cache(D1c, &D1_dflt, "D1");
-   check_cache(L2c, &L2_dflt, "L2");
+   check_cache(I1c, "I1");
+   check_cache(D1c, "D1");
+   check_cache(L2c, "L2");
 
    if (VG_(clo_verbosity) > 1) {
       VG_(message)(Vg_UserMsg, "Cache configuration used:");
diff --git a/cachegrind/x86/cg_arch.c b/cachegrind/x86/cg_arch.c
index 7d6cafa..6e2b710 100644
--- a/cachegrind/x86/cg_arch.c
+++ b/cachegrind/x86/cg_arch.c
@@ -331,18 +331,14 @@
 
 
 void VGA_(configure_caches)(cache_t* I1c, cache_t* D1c, cache_t* L2c,
-                         cache_t* I1_dflt, cache_t* D1_dflt, cache_t* L2_dflt,
-                         Bool all_caches_clo_defined)
+                            Bool all_caches_clo_defined)
 {
    Int res;
    
    // Set caches to default.
-   *I1_dflt = (cache_t) {  65536, 2, 64 };
-   *D1_dflt = (cache_t) {  65536, 2, 64 };
-   *L2_dflt = (cache_t) { 262144, 8, 64 };
-   *I1c = *I1_dflt;
-   *D1c = *D1_dflt;
-   *L2c = *L2_dflt;
+   *I1c = (cache_t) {  65536, 2, 64 };
+   *D1c = (cache_t) {  65536, 2, 64 };
+   *L2c = (cache_t) { 262144, 8, 64 };
 
    // Then replace with any info we can get from CPUID.
    res = get_caches_from_CPUID(I1c, D1c, L2c);