ACK: [PATCH 2/3] kernelscan: remove need to pre-process with a CPP phase

ivanhu ivan.hu at canonical.com
Fri Apr 29 08:56:37 UTC 2016



On 04/27/2016 05:53 PM, Colin King wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> Now that we have an improved and wider function lookup, we can discard
> the awkward pre-processing phase to kernelscan, and hence the -P and -E
> flags since we can do the processing in one parse now.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>   src/utilities/kernelscan.c | 114 +++------------------------------------------
>   1 file changed, 6 insertions(+), 108 deletions(-)
>
> diff --git a/src/utilities/kernelscan.c b/src/utilities/kernelscan.c
> index 3a78ff7..8b25633 100644
> --- a/src/utilities/kernelscan.c
> +++ b/src/utilities/kernelscan.c
> @@ -976,93 +976,6 @@ static void parse_kernel_messages(FILE *fp)
>   	token_free(&t);
>   }
>   
> -/*
> - *  This is evil.  We parse the input stream
> - *  and throw away all #includes so we don't get
> - *  gcc -E breaking on include files that we haven't
> - *  got.  We don't really care at this level about
> - *  macros being expanded as we want to see tokens
> - *  such as KERN_ERR later on.
> - */
> -static int parse_cpp_include(parser *p, token *t)
> -{
> -	/*
> -	 *  Gloop up #include "foo.h"
> -	 */
> -	do {
> -		token_clear(t);
> -		if (get_token(p, t) == EOF)
> -			return EOF;
> -		/* End of line, we're done! */
> -		if (strcmp(t->token, "\n") == 0)
> -			return PARSER_OK;
> -	} while (t->type == TOKEN_WHITE_SPACE);
> -
> -
> -	/*
> -	 *  Ah, we gobbled up white spaces and
> -	 *  now we should be at a '<' token
> -	 *  Parse #include <something/foo.h>
> -	 */
> -	if (t->type == TOKEN_LESS_THAN) {
> -		do {
> -			if (get_token(p, t) == EOF)
> -				return EOF;
> -		} while (t->type != TOKEN_GREATER_THAN);
> -	}
> -
> -	token_clear(t);
> -
> -	return PARSER_OK;
> -}
> -
> -/*
> - *  CPP phase, find and remove #includes
> - */
> -static int parse_cpp_includes(FILE *fp)
> -{
> -	token t;
> -	parser p;
> -
> -	parser_new(&p, fp, false);
> -	p.fp = fp;
> -	p.skip_white_space = false;
> -
> -	token_new(&t);
> -
> -	while ((get_token(&p, &t)) != EOF) {
> -		if (t.type == TOKEN_CPP) {
> -			for (;;) {
> -				token_clear(&t);
> -				if (get_token(&p, &t) == EOF) {
> -					token_free(&t);
> -					return EOF;
> -				}
> -				if (strcmp(t.token, "\n") == 0)
> -					break;
> -				if (t.type == TOKEN_WHITE_SPACE) {
> -					continue;
> -				}
> -				if (strcmp(t.token, "include") == 0) {
> -					if (parse_cpp_include(&p, &t) == EOF) {
> -						token_free(&t);
> -						return EOF;
> -					}
> -					break;
> -				}
> -				printf("#%s", t.token);
> -				break;
> -			}
> -		} else {
> -			printf("%s", t.token);
> -		}
> -		token_clear(&t);
> -	}
> -	token_free(&t);
> -	return EOF;
> -}
> -
> -
>   static void hash_init(void)
>   {
>   	size_t i;
> @@ -1106,28 +1019,13 @@ static void hash_init(void)
>    */
>   int main(int argc, char **argv)
>   {
> -	if (argc < 2) {
> -		fprintf(stderr, "%s: [-E] [-P]\n", argv[0]);
> -		exit(EXIT_FAILURE);
> -	}
> -
> -	/*
> -	 *  GCC -E preprocess phase
> -	 */
> -	if (strcmp(argv[1], "-E") == 0) {
> -		parse_cpp_includes(stdin);
> -		exit(EXIT_SUCCESS);
> -	}
> +	(void)argc;
> +	(void)argv;
>   
> -	/*
> -	 *  Parse kernel printk and dev_err phase
> -	 */
> -	if (strcmp(argv[1], "-P") == 0) {
> -		patterns = klog_load("firmware_error_warning_patterns");
> -		hash_init();
> -		parse_kernel_messages(stdin);
> -		klog_free(patterns);
> -	}
> +	patterns = klog_load("firmware_error_warning_patterns");
> +	hash_init();
> +	parse_kernel_messages(stdin);
> +	klog_free(patterns);
>   
>   	exit(EXIT_SUCCESS);
>   }
Acked-by: Ivan Hu <ivan.hu at canonical.com>



More information about the fwts-devel mailing list