1. Summary
  2. Files
  3. Support
  4. Report Spam
  5. Create account
  6. Log in

Changeset 2241

Show
Ignore:
Timestamp:
11/28/11 18:55:54 (2 years ago)
Author:
kaiwang27
Message:

Add ldscript expression constructors.

Location:
trunk/ld
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/ld/ld_exp.c

    r2233 r2241  
    3434 */ 
    3535 
     36static struct ld_exp *_alloc_exp(struct ld *ld); 
    3637static int64_t _assignment(struct ld *ld, struct ld_exp *le); 
    3738static int64_t _func_addr(struct ld *ld, struct ld_exp *le); 
     
    5152static int64_t _func_sizeof(struct ld *ld, struct ld_exp *le); 
    5253static int64_t _func_sizeof_headers(struct ld *ld, struct ld_exp *le); 
    53 static int64_t _variable(struct ld *ld, const char *name); 
     54static int64_t _symbol_val(struct ld *ld, const char *name); 
    5455 
    5556#define _EXP_EVAL(x) ld_exp_eval(ld, (x)) 
     57 
     58struct ld_exp * 
     59ld_exp_unary(struct ld *ld, enum ld_exp_op op, struct ld_exp *e1) 
     60{ 
     61        struct ld_exp *le; 
     62 
     63        le = _alloc_exp(ld); 
     64        le->le_op = op; 
     65        le->le_e1 = e1; 
     66 
     67        return (le); 
     68} 
     69 
     70struct ld_exp * 
     71ld_exp_binary(struct ld *ld, enum ld_exp_op op, struct ld_exp *e1, 
     72    struct ld_exp *e2) 
     73{ 
     74        struct ld_exp *le; 
     75 
     76        le = _alloc_exp(ld); 
     77        le->le_op = op; 
     78        le->le_e1 = e1; 
     79        le->le_e2 = e2; 
     80 
     81        return (le); 
     82} 
     83 
     84struct ld_exp * 
     85ld_exp_trinary(struct ld *ld, struct ld_exp *e1, struct ld_exp *e2, 
     86    struct ld_exp *e3) 
     87{ 
     88        struct ld_exp *le; 
     89 
     90        le = _alloc_exp(ld); 
     91        le->le_op = LEOP_TRINARY; 
     92        le->le_e1 = e1; 
     93        le->le_e2 = e2; 
     94        le->le_e3 = e3; 
     95 
     96        return (le); 
     97} 
     98 
     99struct ld_exp * 
     100ld_exp_constant(struct ld *ld, int64_t val) 
     101{ 
     102        struct ld_exp *le; 
     103 
     104        le = _alloc_exp(ld); 
     105        le->le_op = LEOP_CONSTANT; 
     106        le->le_val = val; 
     107 
     108        return (le); 
     109} 
     110 
     111struct ld_exp * 
     112ld_exp_symbol(struct ld *ld, const char *name) 
     113{ 
     114        struct ld_exp *le; 
     115 
     116        le = _alloc_exp(ld); 
     117        le->le_op = LEOP_SYMBOL; 
     118        le->le_name = strdup(name); 
     119        if (le->le_name == NULL) 
     120                ld_fatal_std(ld, "calloc"); 
     121 
     122        return (le); 
     123} 
     124 
     125struct ld_exp * 
     126ld_exp_sec_name(struct ld *ld, const char *name) 
     127{ 
     128        struct ld_exp *le; 
     129 
     130        le = _alloc_exp(ld); 
     131        le->le_op = LEOP_SECTION_NAME; 
     132        le->le_name = strdup(name); 
     133        if (le->le_name == NULL) 
     134                ld_fatal_std(ld, "calloc"); 
     135 
     136        return (le); 
     137} 
    56138 
    57139int64_t 
     
    136218        case LEOP_SUBSTRACT: 
    137219                return (_EXP_EVAL(le->le_e1) - _EXP_EVAL(le->le_e2)); 
     220        case LEOP_SYMBOL: 
     221                return (_symbol_val(ld, le->le_name)); 
    138222        case LEOP_TRINARY: 
    139223                return (_EXP_EVAL(le->le_e1) ? _EXP_EVAL(le->le_e2) : 
    140224                    _EXP_EVAL(le->le_e3)); 
    141         case LEOP_VAR: 
    142                 return (_variable(ld, le->le_name)); 
    143225        default: 
    144226                ld_fatal(ld, "internal: unknown ldscript expression op"); 
     
    148230} 
    149231 
     232static struct ld_exp * 
     233_alloc_exp(struct ld *ld) 
     234{ 
     235        struct ld_exp *le; 
     236 
     237        if ((le = calloc(1, sizeof(*le))) == NULL) 
     238                ld_fatal_std(ld, "calloc"); 
     239 
     240        return (le); 
     241} 
     242 
    150243static int64_t 
    151244_assignment(struct ld *ld, struct ld_exp *le) 
     
    173266                return (roundup(_EXP_EVAL(le->le_e1), _EXP_EVAL(le->le_e2))); 
    174267        else 
    175                 return (roundup(_variable(ld, "."), _EXP_EVAL(le->le_e2))); 
     268                return (roundup(_symbol_val(ld, "."), _EXP_EVAL(le->le_e2))); 
    176269} 
    177270 
     
    307400 
    308401static int64_t 
    309 _variable(struct ld *ld, const char *name) 
     402_symbol_val(struct ld *ld, const char *name) 
    310403{ 
    311404 
  • trunk/ld/ld_exp.h

    r2233 r2241  
    6767        LEOP_SIZEOF, 
    6868        LEOP_SIZEOF_HEADERS, 
     69        LEOP_SECTION_NAME, 
    6970        LEOP_SUBSTRACT, 
     71        LEOP_SYMBOL, 
    7072        LEOP_TRINARY, 
    71         LEOP_VAR 
    7273}; 
    7374 
     
    8182}; 
    8283 
    83 int64_t         ld_exp_eval(struct ld *ld, struct ld_exp *le); 
     84struct ld_exp *ld_exp_binary(struct ld *, enum ld_exp_op, struct ld_exp *, 
     85    struct ld_exp *); 
     86struct ld_exp *ld_exp_constant(struct ld *, int64_t); 
     87int64_t ld_exp_eval(struct ld *, struct ld_exp *); 
     88struct ld_exp *ld_exp_sec_name(struct ld *, const char *); 
     89struct ld_exp *ld_exp_symbol(struct ld *, const char *); 
     90struct ld_exp *ld_exp_trinary(struct ld *, struct ld_exp *, struct ld_exp *, 
     91    struct ld_exp *); 
     92struct ld_exp *ld_exp_unary(struct ld *, enum ld_exp_op, struct ld_exp *);