summaryrefslogtreecommitdiff
path: root/regcomp.c
diff options
context:
space:
mode:
authorJarkko Hietaniemi <jhi@iki.fi>2001-12-09 20:55:32 +0000
committerJarkko Hietaniemi <jhi@iki.fi>2001-12-09 20:55:32 +0000
commit5d1c421cd665bb8544e1a2b5a7e6923df02753d0 (patch)
tree03d7aa1610fdfd3668bf4d72fb0dc830f22a7595 /regcomp.c
parent24da999bab16252c9c746d19d6ad1c1ab0cff65b (diff)
downloadperl-5d1c421cd665bb8544e1a2b5a7e6923df02753d0.tar.gz
Apply NetBSD patch-ae: another gcc sparc64 bug.
p4raw-id: //depot/perl@13566
Diffstat (limited to 'regcomp.c')
-rw-r--r--regcomp.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/regcomp.c b/regcomp.c
index c73e815750..40e7916639 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -658,6 +658,17 @@ S_cl_or(pTHX_ RExC_state_t *pRExC_state, struct regnode_charclass_class *cl, str
}
}
+/*
+ * There are strange code-generation bugs caused on sparc64 by gcc-2.95.2.
+ * These need to be revisited when a newer toolchain becomes available.
+ */
+#if defined(__sparc64__) && defined(__GNUC__)
+# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
+# undef SPARC64_GCC_WORKAROUND
+# define SPARC64_GCC_WORKAROUND 1
+# endif
+#endif
+
/* REx optimizer. Converts nodes into quickier variants "in place".
Finds fixed substrings. */
@@ -1203,11 +1214,28 @@ S_study_chunk(pTHX_ RExC_state_t *pRExC_state, regnode **scanp, I32 *deltap, reg
int counted = mincount != 0;
if (data->last_end > 0 && mincount != 0) { /* Ends with a string. */
+#if defined(SPARC64_GCC_WORKAROUND)
+ I32 b = 0;
+ STRLEN l = 0;
+ char *s = NULL;
+ I32 old = 0;
+
+ if (pos_before >= data->last_start_min)
+ b = pos_before;
+ else
+ b = data->last_start_min;
+
+ l = 0;
+ s = SvPV(data->last_found, l);
+ old = b - data->last_start_min;
+
+#else
I32 b = pos_before >= data->last_start_min
? pos_before : data->last_start_min;
STRLEN l;
char *s = SvPV(data->last_found, l);
I32 old = b - data->last_start_min;
+#endif
if (UTF)
old = utf8_hop((U8*)s, old) - (U8*)s;