diff options
Diffstat (limited to 'src/3p')
| -rw-r--r-- | src/3p/chibicc/chibicc.h | 227 | ||||
| -rw-r--r-- | src/3p/chibicc/hashmap.c | 31 | 
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"); -} | 
