diff options
| -rw-r--r-- | Makefile | 8 | ||||
| -rw-r--r-- | test-linearize.c | 83 |
2 files changed, 89 insertions, 2 deletions
@@ -4,12 +4,12 @@ LDFLAGS=-g AR=ar PREFIX=$(HOME) -PROGRAMS=test-lexing test-parsing obfuscate check compile +PROGRAMS=test-lexing test-parsing obfuscate check compile test-linearize LIB_H= token.h parse.h lib.h symbol.h scope.h expression.h target.h LIB_OBJS= parse.o tokenize.o pre-process.o symbol.o lib.o scope.o \ - expression.o show-parse.o evaluate.o expand.o inline.o + expression.o show-parse.o evaluate.o expand.o inline.o linearize.o LIB_FILE= sparse.a LIBS=$(LIB_FILE) @@ -30,6 +30,9 @@ test-lexing: test-lexing.o $(LIB_FILE) test-parsing: test-parsing.o $(LIB_FILE) gcc $(LDFLAGS) -o $@ $< $(LIBS) +test-linearize: test-linearize.o $(LIB_FILE) + gcc $(LDFLAGS) -o $@ $< $(LIBS) + compile: compile.o compile-i386.o $(LIB_FILE) gcc $(LDFLAGS) -o $@ $< compile-i386.o $(LIBS) @@ -52,6 +55,7 @@ show-parse.o: $(LIB_H) symbol.o: $(LIB_H) test-lexing.o: $(LIB_H) test-parsing.o: $(LIB_H) +test-linearize.o: $(LIB_H) compile.o: $(LIB_H) compile-i386.o: $(LIB_H) tokenize.o: $(LIB_H) diff --git a/test-linearize.c b/test-linearize.c new file mode 100644 index 00000000..74b991de --- /dev/null +++ b/test-linearize.c @@ -0,0 +1,83 @@ +/* + * Parse and linearize the tree for testing. + * + * Copyright (C) 2003 Transmeta Corp. + * 2003-2004 Linus Torvalds + * + * Licensed under the Open Software License version 1.1 + */ +#include <stdarg.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> +#include <fcntl.h> + +#include "lib.h" +#include "token.h" +#include "parse.h" +#include "symbol.h" +#include "expression.h" +#include "linearize.h" + +static void clean_up_symbol(struct symbol *sym, void *_parent, int flags) +{ + check_duplicates(sym); + evaluate_symbol(sym); + expand_symbol(sym); + linearize_symbol(sym); +} + +int main(int argc, char **argv) +{ + int fd; + char *filename = NULL, **args; + struct token *token; + + // Initialize symbol stream first, so that we can add defines etc + init_symbols(); + + create_builtin_stream(); + add_pre_buffer("#define __CHECKER__ 1\n"); + add_pre_buffer("extern void *__builtin_memcpy(void *, const void *, unsigned long);\n"); + add_pre_buffer("extern void * __builtin_return_address(int);\n"); + + args = argv; + for (;;) { + char *arg = *++args; + if (!arg) + break; + if (arg[0] == '-') { + args = handle_switch(arg+1, args); + continue; + } + filename = arg; + } + + + fd = open(filename, O_RDONLY); + if (fd < 0) + die("No such file: %s", filename); + + // Tokenize the input stream + token = tokenize(filename, fd, NULL); + close(fd); + + // Prepend any "include" file to the stream. + if (include_fd >= 0) + token = tokenize(include, include_fd, token); + + // Prepend the initial built-in stream + token = tokenize_buffer(pre_buffer, pre_buffer_size, token); + + // Pre-process the stream + token = preprocess(token); + + // Parse the resulting C code + translation_unit(token, &used_list); + + // Do type evaluation and simplify + symbol_iterate(used_list, clean_up_symbol, NULL); + return 0; +} |
