summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorihiro Tanaka <noritnk@kcn.ne.jp>2014-05-25 17:41:11 +0900
committerPaul Eggert <eggert@cs.ucla.edu>2014-09-27 20:56:42 -0700
commit67822cff1f9f54b0de5f4645c76e0777359f0d44 (patch)
tree0262523545682c423d03b15c2c5c951c87321614
parentfaed4fd7cee4e452f8d3bd27c87fbbd92d56ae2e (diff)
downloadgrep-67822cff1f9f54b0de5f4645c76e0777359f0d44.tar.gz
dfa: separate dfaexec function to help optimization by compiler
* src/dfa.c (dfaexec_main): Rename from dfaexec, add inline attribute. (dfaexec_mb): New function. Run it when d->multibyte is true. For this function inlination must be avoided. (dfaexec_sb): New function. Run it when d->multibyte is false. For this function inlination must be avoided. (dfaexec): Call dfaexec_mb or dfaexec_sb accoding to d->multibyte.
-rw-r--r--src/dfa.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/dfa.c b/src/dfa.c
index 5930e542..ff23c07c 100644
--- a/src/dfa.c
+++ b/src/dfa.c
@@ -3267,9 +3267,9 @@ skip_remains_mb (struct dfa *d, unsigned char const *p,
Finally, if BACKREF is non-NULL set *BACKREF to indicate whether we
encountered a back-reference (1) or not (0). The caller may use this
to decide whether to fall back on a backtracking matcher. */
-char *
-dfaexec (struct dfa *d, char const *begin, char *end,
- int allow_nl, size_t *count, int *backref)
+static inline char *
+dfaexec_main (struct dfa *d, char const *begin, char *end,
+ int allow_nl, size_t *count, int *backref, bool const multibyte)
{
state_num s, s1; /* Current state. */
unsigned char const *p, *mbp; /* Current input character. */
@@ -3291,7 +3291,7 @@ dfaexec (struct dfa *d, char const *begin, char *end,
saved_end = *(unsigned char *) end;
*end = eol;
- if (d->multibyte)
+ if (multibyte)
{
memset (&d->mbs, 0, sizeof d->mbs);
if (! d->mb_match_lens)
@@ -3303,7 +3303,7 @@ dfaexec (struct dfa *d, char const *begin, char *end,
for (;;)
{
- if (d->multibyte)
+ if (multibyte)
{
while ((t = trans[s]) != NULL)
{
@@ -3387,7 +3387,7 @@ dfaexec (struct dfa *d, char const *begin, char *end,
}
s1 = s;
- if (d->multibyte)
+ if (multibyte)
{
/* Can match with a multibyte character (and multicharacter
collating element). Transition table might be updated. */
@@ -3432,6 +3432,29 @@ dfaexec (struct dfa *d, char const *begin, char *end,
return (char *) p;
}
+static char *__attribute__((noinline))
+dfaexec_mb (struct dfa *d, char const *begin, char *end,
+ int allow_nl, size_t *count, int *backref)
+{
+ return dfaexec_main (d, begin, end, allow_nl, count, backref, true);
+}
+
+static char *__attribute__((noinline))
+dfaexec_sb (struct dfa *d, char const *begin, char *end,
+ int allow_nl, size_t *count, int *backref)
+{
+ return dfaexec_main (d, begin, end, allow_nl, count, backref, false);
+}
+
+char *
+dfaexec (struct dfa *d, char const *begin, char *end,
+ int allow_nl, size_t *count, int *backref)
+{
+ return (d->multibyte
+ ? dfaexec_mb (d, begin, end, allow_nl, count, backref)
+ : dfaexec_sb (d, begin, end, allow_nl, count, backref));
+}
+
struct dfa *
dfasuperset (struct dfa const *d)
{