187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*===- ScriptParser.yy ----------------------------------------------------===//
287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//                     The MCLinker Project
487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// This file is distributed under the University of Illinois Open Source
687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines// License. See LICENSE.TXT for details.
787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//
887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines//===----------------------------------------------------------------------===*/
987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
1087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%{
1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* C/C++ Declarations */
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptReader.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptScanner.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operator.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Assignment.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/RpnExpr.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/FileToken.h"
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/NameSpec.h"
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/WildcardPattern.h"
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h"
2287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesusing namespace mcld;
2387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#undef yylex
2587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#define yylex m_ScriptScanner.lex
2687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%}
2787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
2887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%code requires {
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/StrToken.h"
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/StringList.h"
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/OutputSectDesc.h"
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/InputSectDesc.h"
3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines#include <llvm/Support/DataTypes.h>
3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesusing namespace mcld;
3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%require "2.4"
4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%skeleton "glr.cc"
413a2e300ddef8b046136a931d632c0671fa1c930fTim Murray/*
423a2e300ddef8b046136a931d632c0671fa1c930fTim Murray * BEGIN android-removed: prevent bison from generating the header in current directory
4387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%defines "ScriptParser.h"
443a2e300ddef8b046136a931d632c0671fa1c930fTim Murray * END android-removed
453a2e300ddef8b046136a931d632c0671fa1c930fTim Murray */
4687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%debug
4787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%error-verbose
4887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%define namespace "mcld"
4987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%define "parser_class_name" "ScriptParser"
5087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { const class LinkerConfig& m_LDConfig }
5187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { class ScriptFile& m_ScriptFile }
5287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { class ScriptScanner& m_ScriptScanner }
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines%parse-param { class ObjectReader& m_ObjectReader}
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines%parse-param { class ArchiveReader& m_ArchiveReader}
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines%parse-param { class DynObjReader& m_DynObjReader}
5687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%parse-param { class GroupReader& m_GroupReader}
5787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%lex-param { const class ScriptFile& m_ScriptFile }
5887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%locations
6087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%initial-action
6187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
6287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  /* Initialize the initial location. */
6387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  @$.begin.filename = @$.end.filename = &(m_ScriptFile.name());
6487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
6587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%start script_file
6787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
6887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%union {
6987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  const std::string* string;
7087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  uint64_t integer;
7187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  RpnExpr* rpn_expr;
7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  StrToken* str_token;
7387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  StringList* str_tokens;
7487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Prolog output_prolog;
7587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Type output_type;
7687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Constraint output_constraint;
7787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  OutputSectDesc::Epilog output_epilog;
7887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  WildcardPattern* wildcard;
7987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  InputSectDesc::Spec input_spec;
8087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
8187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token END 0 /* EOF */
8387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token <string> STRING LNAMESPEC
8487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token <integer> INTEGER
8587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Initial states */
8787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LINKER_SCRIPT DEFSYM VERSION_SCRIPT DYNAMIC_LIST
8887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
8987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Entry point */
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ENTRY
9187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* File Commands */
9287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INCLUDE
9387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INPUT
9487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token GROUP
9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token AS_NEEDED
9687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OUTPUT
9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SEARCH_DIR
9887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token STARTUP
9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Format Commands */
10087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OUTPUT_FORMAT
10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token TARGET
10287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Misc Commands */
10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ASSERT
10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token EXTERN
10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token FORCE_COMMON_ALLOCATION
10687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INHIBIT_COMMON_ALLOCATION
10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INSERT
10887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token NOCROSSREFS
10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OUTPUT_ARCH
11087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LD_FEATURE
11187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Assignments */
11287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token HIDDEN
11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token PROVIDE
11487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token PROVIDE_HIDDEN
11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* SECTIONS Command */
11687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SECTIONS
11787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* MEMORY Command */
11887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MEMORY
11987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* PHDRS Command */
12087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token PHDRS
12187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Builtin Functions */
12287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ABSOLUTE
12387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ADDR
12487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ALIGN
12587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ALIGNOF
12687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token BLOCK
12787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DATA_SEGMENT_ALIGN
12887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DATA_SEGMENT_END
12987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DATA_SEGMENT_RELRO_END
13087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DEFINED
13187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LENGTH
13287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LOADADDR
13387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MAX
13487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MIN
13587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token NEXT
13687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ORIGIN
13787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SEGMENT_START
13887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SIZEOF
13987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SIZEOF_HEADERS
14087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token CONSTANT
14187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Symbolic Constants */
14287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token MAXPAGESIZE
14387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token COMMONPAGESIZE
14487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Input Section Description */
14587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token EXCLUDE_FILE
14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token COMMON
14787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token KEEP
14887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_BY_NAME
14987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_BY_ALIGNMENT
15087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_NONE
15187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SORT_BY_INIT_PRIORITY
15287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Data */
15387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token BYTE
15487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SHORT
15587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token LONG
15687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token QUAD
15787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SQUAD
15887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token FILL
15987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Discarding */
16087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DISCARD
16187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Keywords */
16287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token CREATE_OBJECT_SYMBOLS
16387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token CONSTRUCTORS
16487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Attributes */
16587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Type */
16687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token NOLOAD
16787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token DSECT
16887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token COPY
16987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token INFO
17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token OVERLAY
17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section LMA */
17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token AT
17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Forced Input Alignment */
17487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token SUBALIGN
17587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Constraint */
17687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ONLY_IF_RO
17787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%token ONLY_IF_RW
17887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Operators are listed top to bottem, in ascending order */
17987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left ','
18087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%right '=' ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN AND_ASSIGN OR_ASSIGN LS_ASSIGN RS_ASSIGN
18187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%right '?' ':'
18287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left LOGICAL_OR
18387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left LOGICAL_AND
18487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '|'
18587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '^'
18687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '&'
18787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left EQ NE
18887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '<' LE '>' GE
18987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left LSHIFT RSHIFT
19087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '+' '-'
19187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%left '*' '/' '%'
19287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%right UNARY_PLUS UNARY_MINUS '!' '~'
19387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
19487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <integer> exp
19587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <string> string symbol opt_region opt_lma_region wildcard_pattern
19687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <rpn_expr> script_exp opt_lma opt_align opt_subalign opt_fill
19787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <str_token> input phdr
19887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <str_tokens> input_list opt_phdr opt_exclude_files input_sect_wildcard_patterns
19987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_prolog> output_desc_prolog opt_vma_and_type
20087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_type> opt_type type
20187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_constraint> opt_constraint
20287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <output_epilog> output_desc_epilog
20387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <wildcard> wildcard_file wildcard_section
20487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%type <input_spec> input_sect_spec
20587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
20687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%%
20787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
20887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesscript_file : LINKER_SCRIPT
20987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              { m_ScriptScanner.setLexState(ScriptFile::LDScript); }
21087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              linker_script
21187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              { m_ScriptScanner.popLexState(); }
21287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            ;
21387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21487f34658dec9097d987d254a990ea7f311bfc95fStephen Hineslinker_script : linker_script script_command
21587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | /* Empty */
21687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
21787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
21887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesscript_command : entry_command
21987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | output_format_command
22087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | group_command
22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines               | input_command
22287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | output_command
22387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | search_dir_command
22487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | output_arch_command
22587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | assert_command
22687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | symbol_assignment
22787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | sections_command
22887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | ';'
22987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
23087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesentry_command : ENTRY '(' STRING ')'
23287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { m_ScriptFile.addEntryPoint(*$3); }
23387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
23487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
23587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_format_command : OUTPUT_FORMAT '(' STRING ')'
23687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        { m_ScriptFile.addOutputFormatCmd(*$3); }
23787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      | OUTPUT_FORMAT '(' STRING ',' STRING ',' STRING ')'
23887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        { m_ScriptFile.addOutputFormatCmd(*$3, *$5, *$7); }
23987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      ;
24087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesgroup_command : GROUP '(' input_list ')'
24287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { m_ScriptFile.addGroupCmd(*$3, m_GroupReader, m_LDConfig); }
24387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
24487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
24537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesinput_command : INPUT '(' input_list ')'
24637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                {
24737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                  m_ScriptFile.addInputCmd(*$3, m_ObjectReader, m_ArchiveReader,
24837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                           m_DynObjReader, m_LDConfig);
24937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                }
25037b74a387bb3993387029859c2d9d051c41c724eStephen Hines              ;
25137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
25287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessearch_dir_command : SEARCH_DIR '(' STRING ')'
25387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     { m_ScriptFile.addSearchDirCmd(*$3); }
25487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   ;
25587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
25687f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_command : OUTPUT '(' STRING ')'
25787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { m_ScriptFile.addOutputCmd(*$3); }
25887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
25987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
26087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_arch_command : OUTPUT_ARCH '(' STRING ')'
26187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      { m_ScriptFile.addOutputArchCmd(*$3); }
26287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    ;
26387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
26487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesassert_command : ASSERT '(' script_exp ',' string ')'
26587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { m_ScriptFile.addAssertCmd(*$3, *$5); }
26687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
26787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
26887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_list : { m_ScriptFile.createStringList(); }
26987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             inputs
27087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             { $$ = m_ScriptFile.getCurrentStringList(); }
27187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           ;
27287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
27387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinputs : input
27487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.getCurrentStringList()->push_back($1); }
27587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs input
27687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.getCurrentStringList()->push_back($2); }
27787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs ',' input
27887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.getCurrentStringList()->push_back($3); }
27987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | AS_NEEDED '('
28087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(true); }
28187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         inputs ')'
28287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(false); }
28387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs AS_NEEDED '('
28487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(true); }
28587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         inputs ')'
28687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(false); }
28787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | inputs ',' AS_NEEDED '('
28887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(true); }
28987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         inputs ')'
29087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { m_ScriptFile.setAsNeeded(false); }
29187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       ;
29287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
29387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput : string
29487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        { $$ = FileToken::create(*$1, m_ScriptFile.asNeeded()); }
29587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      | LNAMESPEC
29687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        { $$ = NameSpec::create(*$1, m_ScriptFile.asNeeded()); }
29787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ;
29887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
29987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
30087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  SECTIONS
30187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  {
30287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    sections-command
30387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    sections-command
30487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ...
30587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  }
30687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
30787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessections_command : SECTIONS
30887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.enterSectionsCmd(); }
30987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   '{' sect_commands '}'
31087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.leaveSectionsCmd(); }
31187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
31287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
31387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessect_commands : sect_commands sect_cmd
31487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | /* Empty */
31587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
31687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
31787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
31887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesEach sections-command may of be one of the following:
31987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
32087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan ENTRY command (see Entry command)
32187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa symbol assignment (see Assignments)
32287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan output section description
32387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan overlay description
32487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
32587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessect_cmd : entry_command
32687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | symbol_assignment
32787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | output_sect_desc
32887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
32987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
33087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
33187f34658dec9097d987d254a990ea7f311bfc95fStephen HinesThe full description of an output section looks like this:
33287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
33387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  section [address] [(type)] :
33487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [AT(lma)]
33587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [ALIGN(section_align)]
33687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [SUBALIGN(subsection_align)]
33787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    [constraint]
33887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    {
33987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      output-section-command
34087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      output-section-command
34187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ...
34287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]
34387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
34487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_desc : string output_desc_prolog
34587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.enterOutputSectDesc(*$1, $2); }
34687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   '{'
34787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       output_sect_commands
34887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   '}' output_desc_epilog
34987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { m_ScriptFile.leaveOutputSectDesc($7); }
35087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
35187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
35287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_desc_prolog : {
35387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       m_ScriptScanner.setLexState(ScriptFile::Expression);
35487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       /* create exp for vma */
35587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       m_ScriptFile.createRpnExpr();
35687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     }
35787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     opt_vma_and_type
35887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     { m_ScriptScanner.popLexState(); }
35987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     ':'
36087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     opt_lma opt_align opt_subalign opt_constraint
36187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     {
36287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pVMA       = $2.m_pVMA;
36387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_Type       = $2.m_Type;
36487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pLMA       = $5;
36587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pAlign     = $6;
36687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_pSubAlign  = $7;
36787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                       $$.m_Constraint = $8;
36887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     }
36987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   ;
37087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
37187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_commands : output_sect_commands output_sect_cmd
37287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     | /* Empty */
37387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     ;
37487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
37587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_desc_epilog : opt_region opt_lma_region opt_phdr opt_fill
37687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     {
37787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pRegion    = $1;
37887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pLMARegion = $2;
37987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pPhdrs     = $3;
38087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                        $$.m_pFillExp   = $4;
38187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     }
38287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   ;
38387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
38487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Output Section Attributes */
38587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_vma_and_type : exp opt_type
38687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   {
38787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_pVMA = m_ScriptFile.getCurrentRpnExpr();
38887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_Type = $2;
38987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   }
39087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | opt_type
39187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   {
39287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_pVMA = NULL;
39387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                     $$.m_Type = $1;
39487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   }
39587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
39687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
39787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_type : '(' type ')'
39887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = $2; }
39987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | '(' ')'
40087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = OutputSectDesc::LOAD; }
40187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | /* Empty */
40287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = OutputSectDesc::LOAD; }
40387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
40487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
40587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinestype : NOLOAD
40687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::NOLOAD; }
40787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | DSECT
40887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::DSECT; }
40987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | COPY
41087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::COPY; }
41187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | INFO
41287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::INFO; }
41387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     | OVERLAY
41487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = OutputSectDesc::OVERLAY; }
41587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     ;
41687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
41787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_lma : AT '(' script_exp ')'
41887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          { $$ = $3; }
41987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        | /* Empty */
42087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          { $$ = NULL; }
42187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        ;
42287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
42387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Forced Output Alignment */
42487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_align : ALIGN '(' script_exp ')'
42587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            { $$ = $3; }
42687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          | /* Empty */
42787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines            { $$ = NULL; }
42887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          ;
42987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
43087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/* Forced Input Alignment */
43187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_subalign : SUBALIGN '(' script_exp ')'
43287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               { $$ = $3; }
43387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             | /* Empty */
43487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               { $$ = NULL; }
43587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             ;
43687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
43787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_constraint : ONLY_IF_RO
43887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = OutputSectDesc::ONLY_IF_RO; }
43987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | ONLY_IF_RW
44087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = OutputSectDesc::ONLY_IF_RW; }
44187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | /* Empty */
44287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = OutputSectDesc::NO_CONSTRAINT; }
44387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
44487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
44587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_region : '>' string
44687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             { $$ = $2; }
44787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           | /* Empty */
44887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             { $$ = NULL; }
44987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           ;
45087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
45187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_lma_region : AT '>' string
45287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = $3; }
45387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               | /* Empty */
45487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 { $$ = NULL; }
45587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               ;
45687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
45787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_phdr : { m_ScriptFile.createStringList(); }
45887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           phdrs
45987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = m_ScriptFile.getCurrentStringList(); }
46087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
46187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
46287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesphdrs : phdrs ':' phdr
46387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        { m_ScriptFile.getCurrentStringList()->push_back($3); }
46487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      | /* Empty */
46587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ;
46687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
46787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesphdr : string
46887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       { $$ = StrToken::create(*$1); }
46987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines     ;
47087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
47187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_fill : '=' script_exp
47287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = $2; }
47387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         | /* Empty */
47487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           { $$ = NULL; }
47587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         ;
47687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
47787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines/*
47887f34658dec9097d987d254a990ea7f311bfc95fStephen HinesEach output-section-command may be one of the following:
47987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
48087f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa symbol assignment (see Assignments)
48187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesan input section description (see Input Section)
48287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesdata values to include directly (see Output Section Data)
48387f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesa special output section keyword (see Output Section Keywords)
48487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines*/
48587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_cmd : symbol_assignment
48687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | input_sect_desc
48787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | output_sect_data
48887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | output_sect_keyword
48987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | ';'
49087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                ;
49187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
49287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_sect_desc : input_sect_spec
49387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  { m_ScriptFile.addInputSectDesc(InputSectDesc::NoKeep, $1); }
49487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | KEEP '(' input_sect_spec ')'
49587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  { m_ScriptFile.addInputSectDesc(InputSectDesc::Keep, $3); }
49687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                ;
49787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
49887f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_sect_spec : string
49987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  {
50087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardFile =
50187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      WildcardPattern::create(*$1, WildcardPattern::SORT_NONE);
50287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pExcludeFiles = NULL;
50387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardSections = NULL;
50487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  }
50587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                | wildcard_file '(' opt_exclude_files input_sect_wildcard_patterns ')'
50687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  {
50787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardFile = $1;
50887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pExcludeFiles = $3;
50987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    $$.m_pWildcardSections = $4;
51087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  }
51187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                ;
51287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
51387f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_file : wildcard_pattern
51487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { $$ = WildcardPattern::create(*$1, WildcardPattern::SORT_NONE); }
51587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | SORT_BY_NAME '(' wildcard_pattern ')'
51687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_NAME); }
51787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
51887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
51987f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_pattern : string
52087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = $1; }
52187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | '*'
52287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = &m_ScriptFile.createParserStr("*", 1); }
52387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | '?'
52487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = &m_ScriptFile.createParserStr("?", 1); }
52587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
52687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
52787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesopt_exclude_files : EXCLUDE_FILE '('
52887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { m_ScriptFile.createStringList(); }
52987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    exclude_files ')'
53087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { $$ = m_ScriptFile.getCurrentStringList(); }
53187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | /* Empty */
53287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { $$ = NULL; }
53387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  ;
53487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
53587f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesexclude_files : exclude_files wildcard_pattern
53687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                {
53787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  m_ScriptFile.getCurrentStringList()->push_back(
53887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    WildcardPattern::create(*$2, WildcardPattern::SORT_NONE));
53987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                }
54087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              | wildcard_pattern
54187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                {
54287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  m_ScriptFile.getCurrentStringList()->push_back(
54387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    WildcardPattern::create(*$1, WildcardPattern::SORT_NONE));
54487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                }
54587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines              ;
54687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
54787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesinput_sect_wildcard_patterns : { m_ScriptFile.createStringList(); }
54887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                               wildcard_sections
54987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                               { $$ = m_ScriptFile.getCurrentStringList(); }
55087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                             ;
55187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
55287f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_sections : wildcard_sections wildcard_section
55387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
55487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.getCurrentStringList()->push_back($2);
55587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
55687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | wildcard_section
55787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
55887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.getCurrentStringList()->push_back($1);
55987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
56087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  ;
56187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
56287f34658dec9097d987d254a990ea7f311bfc95fStephen Hineswildcard_section : wildcard_pattern
56387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$1, WildcardPattern::SORT_NONE); }
56487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_NONE '(' wildcard_pattern ')'
56587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_NONE); }
56687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_NAME '(' wildcard_pattern ')'
56787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_NAME); }
56887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_ALIGNMENT '(' wildcard_pattern ')'
56987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_ALIGNMENT); }
57087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_pattern ')' ')'
57187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_NAME_ALIGNMENT); }
57287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_ALIGNMENT '('SORT_BY_NAME '(' wildcard_pattern ')' ')'
57387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_ALIGNMENT_NAME); }
57487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_pattern ')' ')'
57587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_NAME); }
57687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_pattern ')' ')'
57787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$5, WildcardPattern::SORT_BY_ALIGNMENT); }
57887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SORT_BY_INIT_PRIORITY '(' wildcard_pattern ')'
57987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                   { $$ = WildcardPattern::create(*$3, WildcardPattern::SORT_BY_INIT_PRIORITY); }
58087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
58187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
58287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_data : BYTE  '(' script_exp ')'
58387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SHORT '(' script_exp ')'
58487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | LONG  '(' script_exp ')'
58587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | QUAD  '(' script_exp ')'
58687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 | SQUAD '(' script_exp ')'
58787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                 ;
58887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
58987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesoutput_sect_keyword : CREATE_OBJECT_SYMBOLS
59087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    | CONSTRUCTORS
59187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    | SORT_BY_NAME '(' CONSTRUCTORS ')'
59287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    ;
59387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
59487f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessymbol_assignment : symbol '=' script_exp ';'
59587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    { m_ScriptFile.addAssignment(*$1, *$3); }
59687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol ADD_ASSIGN exp ';'
59787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol SUB_ASSIGN exp ';'
59887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol MUL_ASSIGN exp ';'
59987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol DIV_ASSIGN exp ';'
60087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol AND_ASSIGN exp ';'
60187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol OR_ASSIGN exp ';'
60287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol LS_ASSIGN exp ';'
60387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | symbol RS_ASSIGN exp ';'
60487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | HIDDEN '(' symbol '=' script_exp ')' ';'
60587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
60687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.addAssignment(*$3, *$5,
60787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 Assignment::HIDDEN);
60887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
60987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | PROVIDE '(' symbol '=' script_exp ')' ';'
61087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
61187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.addAssignment(*$3, *$5,
61287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 Assignment::PROVIDE);
61387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
61487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  | PROVIDE_HIDDEN '(' symbol '=' script_exp ')' ';'
61587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    {
61687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                      m_ScriptFile.addAssignment(*$3, *$5,
61787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                                 Assignment::PROVIDE_HIDDEN);
61887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    }
61987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                  ;
62087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
62187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesscript_exp : {
62287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               m_ScriptScanner.setLexState(ScriptFile::Expression);
62387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               m_ScriptFile.createRpnExpr();
62487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             }
62587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             exp
62687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             {
62787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               m_ScriptScanner.popLexState();
62887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines               $$ = m_ScriptFile.getCurrentRpnExpr();
62987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines             }
63087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines           ;
63187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
63287f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesexp : '(' exp ')'
63387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
63487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2;
63587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
63687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '+' exp %prec UNARY_PLUS
63787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
63887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
63987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::UNARY_PLUS>());
64087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
64187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
64287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '-' exp %prec UNARY_MINUS
64387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
64487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
64587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::UNARY_MINUS>());
64687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
64787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
64887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '!' exp
64987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
65087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
65187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOGICAL_NOT>());
65287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
65387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
65487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | '~' exp
65587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
65687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
65787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_NOT>());
65887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $2 + 1;
65987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
66087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '*' exp
66187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
66287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
66387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MUL>());
66487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
66587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
66687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '/' exp
66787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
66887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
66987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DIV>());
67087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
67187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
67287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '%' exp
67387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
67487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
67587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MOD>());
67687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
67787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
67887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '+' exp
67987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
68087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
68187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ADD>());
68287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
68387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
68487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '-' exp
68587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
68687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
68787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SUB>());
68887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
68987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
69087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LSHIFT exp
69187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
69287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
69387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LSHIFT>());
69487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
69587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
69687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp RSHIFT exp
69787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
69887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
69987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::RSHIFT>());
70087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
70187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
70287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '<' exp
70387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
70487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
70587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LT>());
70687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
70787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
70887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LE exp
70987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
71087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
71187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LE>());
71287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
71387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
71487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '>' exp
71587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
71687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
71787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::GT>());
71887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
71987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
72087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp GE exp
72187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
72287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
72387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::GE>());
72487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
72587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
72687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp EQ exp
72787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
72887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
72987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::EQ>());
73087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
73187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
73287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp NE exp
73387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
73487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
73587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::NE>());
73687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
73787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
73887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '&' exp
73987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
74087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
74187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_AND>());
74287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
74387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
74487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '^' exp
74587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
74687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
74787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_XOR>());
74887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
74987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
75087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '|' exp
75187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
75287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
75387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::BITWISE_OR>());
75487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
75587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
75687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LOGICAL_AND exp
75787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
75887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
75987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOGICAL_AND>());
76087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
76187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
76287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp LOGICAL_OR exp
76387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
76487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
76587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOGICAL_OR>());
76687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + 1;
76787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
76887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | exp '?' exp ':' exp
76987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
77087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
77187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::TERNARY_IF>());
77287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $1 + $3 + $5 + 1;
77387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
77487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ABSOLUTE '(' exp ')'
77587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
77687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
77787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ABSOLUTE>());
77887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 1;
77987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
78087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ADDR '(' string ')'
78187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
78287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
78387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
78487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ADDR>());
78587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
78687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
78787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ALIGN '(' exp ')'
78887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
78987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        RpnExpr::iterator pos = m_ScriptFile.getCurrentRpnExpr()->begin() +
79087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                m_ScriptFile.getCurrentRpnExpr()->size() - $3;
79187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->insert(pos, SymOperand::create("."));
79287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
79387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGN>());
79487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 2;
79587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
79687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ALIGN '(' exp ',' exp ')'
79787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
79887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
79987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGN>());
80087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
80187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
80287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ALIGNOF '(' string ')'
80387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
80487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
80587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
80687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGNOF>());
80787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
80887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
80987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | BLOCK '(' exp ')'
81087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
81187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        RpnExpr::iterator pos = m_ScriptFile.getCurrentRpnExpr()->begin() +
81287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                                m_ScriptFile.getCurrentRpnExpr()->size() - $3;
81387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->insert(pos, SymOperand::create("."));
81487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
81587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::ALIGN>());
81687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 2;
81787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
81887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DATA_SEGMENT_ALIGN
81987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
82087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SymOperand::create("."));
82187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
82287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      '(' exp ',' exp ')'
82387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
82487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
82587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DATA_SEGMENT_ALIGN>());
82687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $4 + $6 + 2;
82787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
82887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DATA_SEGMENT_END '(' exp ')'
82987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
83087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
83187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DATA_SEGMENT_END>());
83287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 1;
83387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
83487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
83587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
83687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
83787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DATA_SEGMENT_RELRO_END>());
83887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
83987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
84087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | DEFINED '(' symbol ')'
84187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
84287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SymOperand::create(*$3));
84387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
84487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::DEFINED>());
84587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
84687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
84787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | LENGTH '(' string ')'
84887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
84987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        /* TODO */
85087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
85187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | LOADADDR '(' string ')'
85287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
85387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
85487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
85587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::LOADADDR>());
85687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
85787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
85887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | MAX '(' exp ',' exp ')'
85987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
86087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
86187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MAX>());
86287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
86387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
86487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | MIN '(' exp ',' exp ')'
86587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
86687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
86787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MIN>());
86887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + $5 + 1;
86987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
87087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | NEXT '(' exp ')'
87187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
87287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
87387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::NEXT>());
87487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $3 + 1;
87587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
87687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | ORIGIN '(' string ')'
87787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
87887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        /* TODO */
87987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
88087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | SEGMENT_START '(' string
88187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
88287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
88387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
88487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      ',' exp ')'
88587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
88687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
88787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SEGMENT_START>());
88887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = $6 + 2;
88987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
89087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | SIZEOF '(' string ')'
89187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
89287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SectOperand::create(*$3));
89387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
89487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SIZEOF>());
89587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 2;
89687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
89787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | SIZEOF_HEADERS
89887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
89987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
90087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::SIZEOF_HEADERS>());
90187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
90287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
90387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | CONSTANT '(' MAXPAGESIZE ')'
90487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
90587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
90687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::MAXPAGESIZE>());
90787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
90887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
90987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | CONSTANT '(' COMMONPAGESIZE')'
91087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
91187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(
91287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines          &Operator::create<Operator::COMMONPAGESIZE>());
91387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
91487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
91587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | INTEGER
91687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
91787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(IntOperand::create($1));
91887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
91987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
92087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    | symbol
92187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      {
92287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        m_ScriptFile.getCurrentRpnExpr()->push_back(SymOperand::create(*$1));
92387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines        $$ = 1;
92487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines      }
92587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    ;
92687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
92787f34658dec9097d987d254a990ea7f311bfc95fStephen Hinessymbol : STRING
92887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { $$ = $1; }
92987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       ;
93087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
93187f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesstring : STRING
93287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { $$ = $1; }
93387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       | '"' STRING '"'
93487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines         { $$ = $2; }
93587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines       ;
93687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
93787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines%%
93887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
93987f34658dec9097d987d254a990ea7f311bfc95fStephen Hinesvoid mcld::ScriptParser::error(const mcld::ScriptParser::location_type& pLoc,
94087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                               const std::string &pMsg)
94187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines{
94287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  position last = pLoc.end - 1;
94387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  std::string filename = "NaN";
94487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  if (last.filename != NULL)
94587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    filename = *last.filename;
94687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
94787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines  mcld::error(diag::err_syntax_error)
94887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines    << filename << last.line << last.column << pMsg;
94987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines}
95087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines
951