cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

aicasm_macro_gram.y (4018B)


      1%{
      2/*
      3 * Sub-parser for macro invocation in the Aic7xxx SCSI
      4 * Host adapter sequencer assembler.
      5 *
      6 * Copyright (c) 2001 Adaptec Inc.
      7 * All rights reserved.
      8 *
      9 * Redistribution and use in source and binary forms, with or without
     10 * modification, are permitted provided that the following conditions
     11 * are met:
     12 * 1. Redistributions of source code must retain the above copyright
     13 *    notice, this list of conditions, and the following disclaimer,
     14 *    without modification.
     15 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     16 *    substantially similar to the "NO WARRANTY" disclaimer below
     17 *    ("Disclaimer") and any redistribution must be conditioned upon
     18 *    including a substantially similar Disclaimer requirement for further
     19 *    binary redistribution.
     20 * 3. Neither the names of the above-listed copyright holders nor the names
     21 *    of any contributors may be used to endorse or promote products derived
     22 *    from this software without specific prior written permission.
     23 *
     24 * Alternatively, this software may be distributed under the terms of the
     25 * GNU General Public License ("GPL") version 2 as published by the Free
     26 * Software Foundation.
     27 *
     28 * NO WARRANTY
     29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     30 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     31 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     32 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     33 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     37 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     38 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     39 * POSSIBILITY OF SUCH DAMAGES.
     40 *
     41 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_macro_gram.y#5 $
     42 *
     43 * $FreeBSD$
     44 */
     45
     46#include <sys/types.h>
     47
     48#include <inttypes.h>
     49#include <regex.h>
     50#include <stdio.h>
     51#include <stdlib.h>
     52#include <string.h>
     53#include <sysexits.h>
     54
     55#include "../queue.h"
     56
     57#include "aicasm.h"
     58#include "aicasm_symbol.h"
     59#include "aicasm_insformat.h"
     60
     61static symbol_t *macro_symbol;
     62
     63static void add_macro_arg(const char *argtext, int position);
     64void mmerror(const char *string);
     65
     66%}
     67
     68%union {
     69	int		value;
     70	char		*str;
     71	symbol_t	*sym;
     72}
     73
     74
     75%token <str> T_ARG
     76
     77%token <sym> T_SYMBOL
     78
     79%type <value> macro_arglist
     80
     81%%
     82
     83macrocall:
     84	T_SYMBOL '('
     85	{
     86		macro_symbol = $1;
     87	}
     88	macro_arglist ')'
     89	{
     90		if (macro_symbol->info.macroinfo->narg != $4) {
     91			printf("Narg == %d", macro_symbol->info.macroinfo->narg);
     92			stop("Too few arguments for macro invocation",
     93			     EX_DATAERR);
     94			/* NOTREACHED */
     95		}
     96		macro_symbol = NULL;
     97		YYACCEPT;
     98	}
     99;
    100
    101macro_arglist:
    102	{
    103		/* Macros can take 0 arguments */
    104		$$ = 0;
    105	}
    106|	T_ARG
    107	{
    108		$$ = 1;
    109		add_macro_arg($1, 1);
    110	}
    111|	macro_arglist ',' T_ARG
    112	{
    113		if ($1 == 0) {
    114			stop("Comma without preceding argument in arg list",
    115			     EX_DATAERR);
    116			/* NOTREACHED */
    117		}
    118		$$ = $1 + 1;
    119		add_macro_arg($3, $$);
    120	}
    121;
    122
    123%%
    124
    125static void
    126add_macro_arg(const char *argtext, int argnum)
    127{
    128	struct macro_arg *marg;
    129	int i;
    130
    131	if (macro_symbol == NULL || macro_symbol->type != MACRO) {
    132		stop("Invalid current symbol for adding macro arg",
    133		     EX_SOFTWARE);
    134		/* NOTREACHED */
    135	}
    136	/*
    137	 * Macro Invocation.  Find the appropriate argument and fill
    138	 * in the replace ment text for this call.
    139	 */
    140	i = 0;
    141	STAILQ_FOREACH(marg, &macro_symbol->info.macroinfo->args, links) {
    142		i++;
    143		if (i == argnum)
    144			break;
    145	}
    146	if (marg == NULL) {
    147		stop("Too many arguments for macro invocation", EX_DATAERR);
    148		/* NOTREACHED */
    149	}
    150	marg->replacement_text = strdup(argtext);
    151	if (marg->replacement_text == NULL) {
    152		stop("Unable to replicate replacement text", EX_SOFTWARE);
    153		/* NOTREACHED */
    154	}
    155}
    156
    157void
    158mmerror(const char *string)
    159{
    160	stop(string, EX_DATAERR);
    161}