summaryrefslogtreecommitdiffhomepage
path: root/src/3p
diff options
context:
space:
mode:
Diffstat (limited to 'src/3p')
-rw-r--r--src/3p/chibicc/chibicc.h227
-rw-r--r--src/3p/chibicc/hashmap.c31
2 files changed, 4 insertions, 254 deletions
diff --git a/src/3p/chibicc/chibicc.h b/src/3p/chibicc/chibicc.h
index 82aad11..dd810ec 100644
--- a/src/3p/chibicc/chibicc.h
+++ b/src/3p/chibicc/chibicc.h
@@ -3,46 +3,31 @@
#ifndef INC_CHIBICC_H
#define INC_CHIBICC_H
-// note: removing defs/headers that aren't needed in tokenize.c and/or don't
-// exist on Windows, in order to get our stuff working. total hack; oh well.
-//#define _POSIX_C_SOURCE 200809L
#include <assert.h>
#include <ctype.h>
#include <errno.h>
-//#include <glob.h>
-//#include <libgen.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
-// stdnoreturn means we can't use our noreturn (_Noreturn void)
+// mike: stdnoreturn means we can't use our noreturn (_Noreturn void)
// there are no noreturns in tokenize.c anyway, and the ones in this header have
// been changed to just _Noreturn to avoid any possible conflict
//#include <stdnoreturn.h>
#include <string.h>
-//#include <strings.h>
-#include <sys/stat.h>
-//#include <sys/types.h>
-//#include <sys/wait.h>
-#include <time.h>
-//#include <unistd.h>
// exists on all Unixes but normally hidden behind _GNU_SOURCE on Linux.
// missing entirely on Windows (implemented in 3p/openbsd/asprintf.c for compat)
int vasprintf(char **str, const char *fmt, va_list ap);
-#define MAX(x, y) ((x) < (y) ? (y) : (x))
-#define MIN(x, y) ((x) < (y) ? (x) : (y))
-
#if !defined(__GNUC__) && !defined(__clang__)
# define __attribute__(x)
#endif
typedef struct Type Type;
-typedef struct Node Node;
typedef struct Member Member;
-typedef struct Relocation Relocation;
+typedef struct Node Node;
typedef struct Hideset Hideset;
//
@@ -136,192 +121,6 @@ static inline char *format(const char *fmt, ...) {
error("internal error at %s:%d", __FILE__, __LINE__)
//
-// preprocess.c
-//
-
-char *search_include_paths(char *filename);
-void init_macros(void);
-void define_macro(char *name, char *buf);
-void undef_macro(char *name);
-Token *preprocess(Token *tok);
-
-//
-// parse.c
-//
-
-// Variable or function
-typedef struct Obj Obj;
-struct Obj {
- Obj *next;
- char *name; // Variable name
- Type *ty; // Type
- Token *tok; // representative token
- bool is_local; // local or global/function
- int align; // alignment
-
- // Local variable
- int offset;
-
- // Global variable or function
- bool is_function;
- bool is_definition;
- bool is_static;
-
- // Global variable
- bool is_tentative;
- bool is_tls;
- char *init_data;
- Relocation *rel;
-
- // Function
- bool is_inline;
- Obj *params;
- Node *body;
- Obj *locals;
- Obj *va_area;
- Obj *alloca_bottom;
- int stack_size;
-
- // Static inline function
- bool is_live;
- bool is_root;
- StringArray refs;
-};
-
-// Global variable can be initialized either by a constant expression
-// or a pointer to another global variable. This struct represents the
-// latter.
-typedef struct Relocation Relocation;
-struct Relocation {
- Relocation *next;
- int offset;
- char **label;
- long addend;
-};
-
-// AST node
-typedef enum {
- ND_NULL_EXPR, // Do nothing
- ND_ADD, // +
- ND_SUB, // -
- ND_MUL, // *
- ND_DIV, // /
- ND_NEG, // unary -
- ND_MOD, // %
- ND_BITAND, // &
- ND_BITOR, // |
- ND_BITXOR, // ^
- ND_SHL, // <<
- ND_SHR, // >>
- ND_EQ, // ==
- ND_NE, // !=
- ND_LT, // <
- ND_LE, // <=
- ND_ASSIGN, // =
- ND_COND, // ?:
- ND_COMMA, // ,
- ND_MEMBER, // . (struct member access)
- ND_ADDR, // unary &
- ND_DEREF, // unary *
- ND_NOT, // !
- ND_BITNOT, // ~
- ND_LOGAND, // &&
- ND_LOGOR, // ||
- ND_RETURN, // "return"
- ND_IF, // "if"
- ND_FOR, // "for" or "while"
- ND_DO, // "do"
- ND_SWITCH, // "switch"
- ND_CASE, // "case"
- ND_BLOCK, // { ... }
- ND_GOTO, // "goto"
- ND_GOTO_EXPR, // "goto" labels-as-values
- ND_LABEL, // Labeled statement
- ND_LABEL_VAL, // [GNU] Labels-as-values
- ND_FUNCALL, // Function call
- ND_EXPR_STMT, // Expression statement
- ND_STMT_EXPR, // Statement expression
- ND_VAR, // Variable
- ND_VLA_PTR, // VLA designator
- ND_NUM, // Integer
- ND_CAST, // Type cast
- ND_MEMZERO, // Zero-clear a stack variable
- ND_ASM, // "asm"
- ND_CAS, // Atomic compare-and-swap
- ND_EXCH, // Atomic exchange
-} NodeKind;
-
-// AST node type
-struct Node {
- NodeKind kind; // Node kind
- Node *next; // Next node
- Type *ty; // Type, e.g. int or pointer to int
- Token *tok; // Representative token
-
- Node *lhs; // Left-hand side
- Node *rhs; // Right-hand side
-
- // "if" or "for" statement
- Node *cond;
- Node *then;
- Node *els;
- Node *init;
- Node *inc;
-
- // "break" and "continue" labels
- char *brk_label;
- char *cont_label;
-
- // Block or statement expression
- Node *body;
-
- // Struct member access
- Member *member;
-
- // Function call
- Type *func_ty;
- Node *args;
- bool pass_by_stack;
- Obj *ret_buffer;
-
- // Goto or labeled statement, or labels-as-values
- char *label;
- char *unique_label;
- Node *goto_next;
-
- // Switch
- Node *case_next;
- Node *default_case;
-
- // Case
- long begin;
- long end;
-
- // "asm" string literal
- char *asm_str;
-
- // Atomic compare-and-swap
- Node *cas_addr;
- Node *cas_old;
- Node *cas_new;
-
- // Atomic op= operators
- Obj *atomic_addr;
- Node *atomic_expr;
-
- // Variable
- Obj *var;
-
- // Numeric literal
- int64_t val;
- long double fval;
-};
-
-Node *new_cast(Node *expr, Type *ty);
-int64_t const_expr(Token **rest, Token *tok);
-Obj *parse(Token *tok);
-
-//
// type.c
//
@@ -370,8 +169,8 @@ struct Type {
int array_len;
// Variable-length array
- Node *vla_len; // # of elements
- Obj *vla_size; // sizeof() value
+ //Node *vla_len; // # of elements
+ //Obj *vla_size; // sizeof() value
// Struct
Member *members;
@@ -432,13 +231,6 @@ Type *struct_type(void);
void add_type(Node *node);
//
-// codegen.c
-//
-
-void codegen(Obj *prog, FILE *out);
-int align_to(int n, int align);
-
-//
// unicode.c
//
@@ -472,15 +264,4 @@ void hashmap_delete(HashMap *map, char *key);
void hashmap_delete2(HashMap *map, char *key, int keylen);
void hashmap_test(void);
-//
-// main.c
-//
-
-bool file_exists(char *path);
-
-extern StringArray include_paths;
-extern bool opt_fpic;
-extern bool opt_fcommon;
-extern char *base_file;
-
#endif
diff --git a/src/3p/chibicc/hashmap.c b/src/3p/chibicc/hashmap.c
index 46539d9..47110c6 100644
--- a/src/3p/chibicc/hashmap.c
+++ b/src/3p/chibicc/hashmap.c
@@ -132,34 +132,3 @@ void hashmap_delete2(HashMap *map, char *key, int keylen) {
if (ent)
ent->key = TOMBSTONE;
}
-
-void hashmap_test(void) {
- HashMap *map = calloc(1, sizeof(HashMap));
-
- for (int i = 0; i < 5000; i++)
- hashmap_put(map, format("key %d", i), (void *)(size_t)i);
- for (int i = 1000; i < 2000; i++)
- hashmap_delete(map, format("key %d", i));
- for (int i = 1500; i < 1600; i++)
- hashmap_put(map, format("key %d", i), (void *)(size_t)i);
- for (int i = 6000; i < 7000; i++)
- hashmap_put(map, format("key %d", i), (void *)(size_t)i);
-
- for (int i = 0; i < 1000; i++)
- assert((size_t)hashmap_get(map, format("key %d", i)) == i);
- for (int i = 1000; i < 1500; i++)
- assert(hashmap_get(map, "no such key") == NULL);
- for (int i = 1500; i < 1600; i++)
- assert((size_t)hashmap_get(map, format("key %d", i)) == i);
- for (int i = 1600; i < 2000; i++)
- assert(hashmap_get(map, "no such key") == NULL);
- for (int i = 2000; i < 5000; i++)
- assert((size_t)hashmap_get(map, format("key %d", i)) == i);
- for (int i = 5000; i < 6000; i++)
- assert(hashmap_get(map, "no such key") == NULL);
- for (int i = 6000; i < 7000; i++)
- hashmap_put(map, format("key %d", i), (void *)(size_t)i);
-
- assert(hashmap_get(map, "no such key") == NULL);
- printf("OK\n");
-}