From 0e0e7195fca05f706c1701484710fea9fc8b21f5 Mon Sep 17 00:00:00 2001 From: Jiajie Li Date: Mon, 12 Oct 2020 13:41:06 +0800 Subject: [PATCH 27/89] kpatch_parse: Split function init_multilines The function init_multilines is arch related, so let's make two definations in arch/x86/arch_parse.c and arch/aarch64/arch_parse.c Signed-off-by: Jiajie Li Signed-off-by: Ying Fang --- src/arch/aarch64/arch_parse.c | 67 +++++++++++++++++++++++++++++++++++ src/arch/x86/arch_parse.c | 65 +++++++++++++++++++++++++++++++++ src/kpatch_parse.c | 65 --------------------------------- 3 files changed, 132 insertions(+), 65 deletions(-) diff --git a/src/arch/aarch64/arch_parse.c b/src/arch/aarch64/arch_parse.c index 8eb88a9..1233e03 100644 --- a/src/arch/aarch64/arch_parse.c +++ b/src/arch/aarch64/arch_parse.c @@ -4,6 +4,73 @@ #include "include/kpatch_parse.h" #include "include/kpatch_flags.h" +/* break manually crafted multiple statements separated by ; to separate lines */ +void init_multilines(struct kp_file *f) +{ + int i, nr, sz = 64, slen, first_token; + char **lines = NULL, *s, *se; + int *lines_num = NULL; + kpstr_t t; + + nr = 0; + for (i = 0; i < f->nr_lines; i++) { + if (nr + 1000 >= sz || !lines) { + sz *= 2; + lines = kp_realloc(lines, (sz/2) * sizeof(char *), sz * sizeof(char *)); + lines_num = kp_realloc(lines_num, (sz/2) * sizeof(int), sz * sizeof(int)); + } + + s = f->lines[i]; + if (strpbrk(s, ";:") != NULL) { + while (s && *s) { + se = s; + slen = strlen(s); + first_token = 1; + while (se) { + get_token(&se, &t); + if (t.l == 1 && t.s[0] == '#') + goto done; + if (t.l == 2 && t.s[0] == '/' && t.s[1] == '/') + goto done; + if (t.l == 1 && t.s[0] == ';') { + slen = t.s - s; + break; + } + /* first token with ':' after is + * the label, separate it unless + * it is done already (next non-blank + * is '\0') + */ + if (first_token && se && + se[0] == ':' && + se[1] != '\0') { + slen = se - s + 1; + se++; + break; + } + first_token = 0; + } + lines[nr] = strndup(s, slen); + s = se; + lines_num[nr] = i; + nr++; + if (nr >= sz) + kpfatal("oops, not prepared to handle >1000 asm statements in single line"); + } + free(f->lines[i]); + } else { +done: + lines[nr] = s; + lines_num[nr] = i; + nr++; + } + } + free(f->lines); + f->lines = lines; + f->lines_num = lines_num; + f->nr_lines = nr; +} + int parse_ctype(char *origs, bool with_checks) { char *s = origs; diff --git a/src/arch/x86/arch_parse.c b/src/arch/x86/arch_parse.c index 5a67116..92ff483 100644 --- a/src/arch/x86/arch_parse.c +++ b/src/arch/x86/arch_parse.c @@ -4,6 +4,71 @@ #include "include/kpatch_parse.h" #include "include/kpatch_flags.h" +/* break manually crafted multiple statements separated by ; to separate lines */ +void init_multilines(struct kp_file *f) +{ + int i, nr, sz = 64, slen, first_token; + char **lines = NULL, *s, *se; + int *lines_num = NULL; + kpstr_t t; + + nr = 0; + for (i = 0; i < f->nr_lines; i++) { + if (nr + 1000 >= sz || !lines) { + sz *= 2; + lines = kp_realloc(lines, (sz/2) * sizeof(char *), sz * sizeof(char *)); + lines_num = kp_realloc(lines_num, (sz/2) * sizeof(int), sz * sizeof(int)); + } + + s = f->lines[i]; + if (strpbrk(s, ";:") != NULL) { + while (s && *s) { + se = s; + slen = strlen(s); + first_token = 1; + while (se) { + get_token(&se, &t); + if (t.l == 1 && t.s[0] == '#') + goto done; + if (t.l == 1 && t.s[0] == ';') { + slen = t.s - s; + break; + } + /* first token with ':' after is + * the label, separate it unless + * it is done already (next non-blank + * is '\0') + */ + if (first_token && se && + se[0] == ':' && + se[1] != '\0') { + slen = se - s + 1; + se++; + break; + } + first_token = 0; + } + lines[nr] = strndup(s, slen); + s = se; + lines_num[nr] = i; + nr++; + if (nr >= sz) + kpfatal("oops, not prepared to handle >1000 asm statements in single line"); + } + free(f->lines[i]); + } else { +done: + lines[nr] = s; + lines_num[nr] = i; + nr++; + } + } + free(f->lines); + f->lines = lines; + f->lines_num = lines_num; + f->nr_lines = nr; +} + int parse_ctype(char *origs, bool with_checks) { char *s = origs; diff --git a/src/kpatch_parse.c b/src/kpatch_parse.c index 4bafdb7..857dbf3 100644 --- a/src/kpatch_parse.c +++ b/src/kpatch_parse.c @@ -136,71 +136,6 @@ int is_sect_cmd(struct kp_file *f, int l) t == DIRECTIVE_PREVIOUS || t == DIRECTIVE_SUBSECTION; } -/* break manually crafted multiple statements separated by ; to separate lines */ -void init_multilines(struct kp_file *f) -{ - int i, nr, sz = 64, slen, first_token; - char **lines = NULL, *s, *se; - int *lines_num = NULL; - kpstr_t t; - - nr = 0; - for (i = 0; i < f->nr_lines; i++) { - if (nr + 1000 >= sz || !lines) { - sz *= 2; - lines = kp_realloc(lines, (sz/2) * sizeof(char *), sz * sizeof(char *)); - lines_num = kp_realloc(lines_num, (sz/2) * sizeof(int), sz * sizeof(int)); - } - - s = f->lines[i]; - if (strpbrk(s, ";:") != NULL) { - while (s && *s) { - se = s; - slen = strlen(s); - first_token = 1; - while (se) { - get_token(&se, &t); - if (t.l == 1 && t.s[0] == '#') - goto done; - if (t.l == 1 && t.s[0] == ';') { - slen = t.s - s; - break; - } - /* first token with ':' after is - * the label, separate it unless - * it is done already (next non-blank - * is '\0') - */ - if (first_token && se && - se[0] == ':' && - se[1] != '\0') { - slen = se - s + 1; - se++; - break; - } - first_token = 0; - } - lines[nr] = strndup(s, slen); - s = se; - lines_num[nr] = i; - nr++; - if (nr >= sz) - kpfatal("oops, not prepared to handle >1000 asm statements in single line"); - } - free(f->lines[i]); - } else { -done: - lines[nr] = s; - lines_num[nr] = i; - nr++; - } - } - free(f->lines); - f->lines = lines; - f->lines_num = lines_num; - f->nr_lines = nr; -} - void init_ctypes(struct kp_file *f) { int i; -- 2.23.0