1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/*===- ScriptScanner.ll ---------------------------------------------------===// 2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// The MCLinker Project 4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source 6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details. 7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===*/ 9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%{ 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* C/C++ Declarations */ 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptScanner.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptFile.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MsgHandling.h" 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/ADT/StringRef.h> 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <string> 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef mcld::ScriptParser::token token; 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef mcld::ScriptParser::token_type token_type; 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#define yyterminate() return token::END 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#define YY_NO_UNISTD_H 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%} 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 2604c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines%{ 2704c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#ifdef __clang__ 2804c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#pragma clang diagnostic push 2904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#pragma clang diagnostic ignored "-Wdeprecated-register" 3004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#endif 3104c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines%} 3204c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Flex Declarations and Options */ 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option c++ 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option batch 36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option noyywrap 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option nounput 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%option stack 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%{ 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#define YY_USER_ACTION yylloc->columns(yyleng); 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%} 43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* abbrev. of RE @ref binutils ld/ldlex.l */ 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesFILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~] 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9] 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesNOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\[\]\\\~] 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesWILDCHAR [_a-zA-Z0-9\/\.\-\_\+\$\[\]\\\,\~\?\*\^\!] 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesWS [ \t\r] 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/* Start conditions */ 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%s LDSCRIPT 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%s EXPRESSION 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%% /* Regular Expressions */ 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* code to place at the beginning of yylex() */ 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%{ 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* reset location */ 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* determine the initial parser state */ 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (m_Kind == ScriptFile::Unknown) { 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_Kind = pScriptFile.getKind(); 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (pScriptFile.getKind()) { 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::LDScript: 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::Expression: 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::LINKER_SCRIPT; 69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::VersionScript: 70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::DynamicList: 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0 && "Unsupported script type!"); 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%} 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Entry Point */ 79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ENTRY" { return token::ENTRY; } 80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* File Commands */ 81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INCLUDE" { return token::INCLUDE; } 82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INPUT" { return token::INPUT; } 83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"GROUP" { return token::GROUP; } 84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"AS_NEEDED" { return token::AS_NEEDED; } 85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"OUTPUT" { return token::OUTPUT; } 86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SEARCH_DIR" { return token::SEARCH_DIR; } 87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"STARTUP" { return token::STARTUP; } 88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Format Commands */ 89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"OUTPUT_FORMAT" { return token::OUTPUT_FORMAT; } 90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"TARGET" { return token::TARGET; } 91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Misc Commands */ 92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ASSERT" { return token::ASSERT; } 93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"EXTERN" { return token::EXTERN; } 94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"FORCE_COMMON_ALLOCATION" { return token::FORCE_COMMON_ALLOCATION; } 95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INHIBIT_COMMON_ALLOCATION" { return token::INHIBIT_COMMON_ALLOCATION; } 96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"INSERT" { return token::INSERT; } 97f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"NOCROSSREFS" { return token::NOCROSSREFS; } 98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"OUTPUT_ARCH" { return token::OUTPUT_ARCH; } 99f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"LD_FEATURE" { return token::LD_FEATURE; } 100f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Assignemnts */ 101f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"HIDDEN" { return token::HIDDEN; } 102f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"PROVIDE" { return token::PROVIDE; } 103f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"PROVIDE_HIDDEN" { return token::PROVIDE_HIDDEN; } 104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* SECTIONS Command */ 105f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SECTIONS" { return token::SECTIONS; } 106f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* MEMORY Command */ 107f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"MEMORY" { return token::MEMORY; } 108f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* PHDRS Command */ 109f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"PHDRS" { return token::PHDRS; } 110f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Builtin Functions */ 111f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ABSOLUTE" { return token::ABSOLUTE; } 112f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ADDR" { return token::ADDR; } 113f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"ALIGN" { return token::ALIGN; } 114f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ALIGNOF" { return token::ALIGNOF; } 115f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"BLOCK" { return token::BLOCK; } 116f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DATA_SEGMENT_ALIGN" { return token::DATA_SEGMENT_ALIGN; } 117f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DATA_SEGMENT_END" { return token::DATA_SEGMENT_END; } 118f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DATA_SEGMENT_RELRO_END" { return token::DATA_SEGMENT_RELRO_END; } 119f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"DEFINED" { return token::DEFINED; } 120f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"LENGTH" { return token::LENGTH; } 121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"LOADADDR" { return token::LOADADDR; } 122f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"MAX" { return token::MAX; } 123f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"MIN" { return token::MIN; } 124f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"NEXT" { return token::NEXT; } 125f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"ORIGIN" { return token::ORIGIN; } 126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"SEGMENT_START" { return token::SEGMENT_START; } 127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"SIZEOF" { return token::SIZEOF; } 128f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"SIZEOF_HEADERS" { return token::SIZEOF_HEADERS; } 129f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"CONSTANT" { return token::CONSTANT; } 130f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Symbolic Constants */ 131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"MAXPAGESIZE" { return token::MAXPAGESIZE; } 132f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>"COMMONPAGESIZE" { return token::COMMONPAGESIZE; } 133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Input Section Description */ 134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"EXCLUDE_FILE" { return token::EXCLUDE_FILE; } 135f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"KEEP" { return token::KEEP; } 136f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT" { return token::SORT_BY_NAME; } 137f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_BY_NAME" { return token::SORT_BY_NAME; } 138f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_BY_ALIGNMENT" { return token::SORT_BY_ALIGNMENT; } 139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_NONE" { return token::SORT_NONE; } 140f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SORT_BY_INIT_PRIORITY" { return token::SORT_BY_INIT_PRIORITY; } 141f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Data */ 142f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"BYTE" { return token::BYTE; } 143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SHORT" { return token::SHORT; } 144f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"LONG" { return token::LONG; } 145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"QUAD" { return token::QUAD; } 146f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SQUAD" { return token::SQUAD; } 147f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"FILL" { return token::FILL; } 148f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Discarding */ 149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"DISCARD" { return token::DISCARD; } 150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Keywords */ 151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"CREATE_OBJECT_SYMBOLS" { return token::CREATE_OBJECT_SYMBOLS; } 152f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"CONSTRUCTORS" { return token::CONSTRUCTORS; } 153f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Attributes */ 154f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Type */ 155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"NOLOAD" { return token::NOLOAD; } 156f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"DSECT" { return token::DSECT; } 157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"COPY" { return token::COPY; } 158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"INFO" { return token::INFO; } 159f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"OVERLAY" { return token::OVERLAY; } 160f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section LMA */ 161f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"AT" { return token::AT; } 162f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Forced Input Alignment */ 163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"SUBALIGN" { return token::SUBALIGN; } 164f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Output Section Constraint */ 165f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ONLY_IF_RO" { return token::ONLY_IF_RO; } 166f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"ONLY_IF_RW" { return token::ONLY_IF_RW; } 167f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Operators */ 168f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<<" { return token::LSHIFT; } 169f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">>" { return token::RSHIFT; } 170f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"==" { return token::EQ; } 171f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"!=" { return token::NE; } 172f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<=" { return token::LE; } 173f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">=" { return token::GE; } 174f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"&&" { return token::LOGICAL_AND; } 175f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"||" { return token::LOGICAL_OR; } 176f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"+=" { return token::ADD_ASSIGN; } 177f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"-=" { return token::SUB_ASSIGN; } 178f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"*=" { return token::MUL_ASSIGN; } 179f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"/=" { return token::DIV_ASSIGN; } 180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"&=" { return token::AND_ASSIGN; } 181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"|=" { return token::OR_ASSIGN; } 182f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<<=" { return token::LS_ASSIGN; } 183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">>=" { return token::RS_ASSIGN; } 184f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"," { return static_cast<token_type>(*yytext); } 185f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"=" { return static_cast<token_type>(*yytext); } 186f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"?" { return static_cast<token_type>(*yytext); } 187f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>":" { return static_cast<token_type>(*yytext); } 188f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"|" { return static_cast<token_type>(*yytext); } 189f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"^" { return static_cast<token_type>(*yytext); } 190f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"&" { return static_cast<token_type>(*yytext); } 191f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"<" { return static_cast<token_type>(*yytext); } 192f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>">" { return static_cast<token_type>(*yytext); } 193f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"+" { return static_cast<token_type>(*yytext); } 194f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"-" { return static_cast<token_type>(*yytext); } 195f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"*" { return static_cast<token_type>(*yytext); } 196f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"/" { return static_cast<token_type>(*yytext); } 197f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"%" { return static_cast<token_type>(*yytext); } 198f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"!" { return static_cast<token_type>(*yytext); } 199f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"~" { return static_cast<token_type>(*yytext); } 200f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>";" { return static_cast<token_type>(*yytext); } 201f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"(" { return static_cast<token_type>(*yytext); } 202f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>")" { return static_cast<token_type>(*yytext); } 203f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"{" { return static_cast<token_type>(*yytext); } 204f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"}" { return static_cast<token_type>(*yytext); } 205f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 206f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Numbers */ 207f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? { 208f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::StringRef str(yytext, yyleng); 209f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (str.back()) { 210f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'k': 211f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'K': 212f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines str.substr(0, yyleng - 1).getAsInteger(0, yylval->integer); 213f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->integer *= 1024; 214f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 215f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'm': 216f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case 'M': 217f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines str.substr(0, yyleng - 1).getAsInteger(0, yylval->integer); 218f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->integer *= 1024 * 1024; 219f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 220f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 221f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines str.getAsInteger(0, yylval->integer); 222f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 223f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 224f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::INTEGER; 225f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 226f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 227f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* Expression string */ 228f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<EXPRESSION>{FILENAMECHAR1}{SYMBOLCHARN}* { 229f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 230f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 231f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 232f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 233f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 234f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* String */ 235f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>{FILENAMECHAR1}{NOCFILENAMECHAR}* { 236f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 237f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 238f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 239f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 240f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 241f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>\"(\\.|[^\\"])*\" { 242f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /*" c string literal */ 243f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 244f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 245f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 246f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 247f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 248f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* -l namespec */ 249f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>"-l"{FILENAMECHAR1}{NOCFILENAMECHAR}* { 250f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext + 2, yyleng - 2); 251f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 252f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::LNAMESPEC; 253f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 254f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 255f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* WILDCHAR String */ 256f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT>{WILDCHAR}* { 257f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (yytext[0] == '/' && yytext[1] == '*') { 258f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yyless (2); 259f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines enterComments(*yylloc); 260f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } else { 261f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& str = pScriptFile.createParserStr(yytext, yyleng); 262f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylval->string = &str; 263f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return token::STRING; 264f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 265f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 266f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 267f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* gobble up C comments */ 268f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>"/*" { 269f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines enterComments(*yylloc); 270f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 271f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 272f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 273f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* gobble up white-spaces */ 274f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>{WS}+ { 275f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 276f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 277f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 278f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* gobble up end-of-lines */ 279f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines<LDSCRIPT,EXPRESSION>\n { 280f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->lines(1); 281f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines yylloc->step(); 282f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 283f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 284f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines%% /* Additional Code */ 285f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 286f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesnamespace mcld { 287f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 288f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesScriptScanner::ScriptScanner(std::istream* yyin, std::ostream* yyout) 289f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines : yyFlexLexer(yyin, yyout), m_Kind(ScriptFile::Unknown) 290f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 291f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 292f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 293f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesScriptScanner::~ScriptScanner() 294f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 295f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 296f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 297f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptScanner::enterComments(ScriptParser::location_type& pLocation) 298f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 299f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const int start_line = pLocation.begin.line; 300f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const int start_col = pLocation.begin.column; 301f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 302f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines int ch = 0; 303f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 304f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines while (true) { 305f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 306f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 307f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 308f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines while (ch != '*' && ch != EOF) { 309f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '\n') { 310f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.lines(1); 311f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 312f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 313f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 314f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 315f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 316f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 317f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '*') { 318f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 319f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 320f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 321f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines while (ch == '*') { 322f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines ch = yyinput(); 323f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.columns(1); 324f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 325f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 326f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '/') 327f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 328f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 329f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 330f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == '\n') 331f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines pLocation.lines(1); 332f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 333f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (ch == EOF) { 334f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines error(diag::err_unterminated_comment) << pLocation.begin.filename 335f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines << start_line 336f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines << start_col; 337f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 338f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 339f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 340f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 341f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 342f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptScanner::setLexState(ScriptFile::Kind pKind) 343f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 344f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* push the state into the top of stach */ 345f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_StateStack.push(pKind); 346f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 347f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (pKind) { 348f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::LDScript: 349f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(LDSCRIPT); 350f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 351f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::Expression: 352f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(EXPRESSION); 353f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 354f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::VersionScript: 355f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::DynamicList: 356f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 357f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0 && "Unsupported script type!"); 358f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 359f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 360f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 361f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 362f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptScanner::popLexState() 363f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 364f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* pop the last state */ 365f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_StateStack.pop(); 366f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 367f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines /* resume the appropriate state */ 368f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (!m_StateStack.empty()) { 369f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (m_StateStack.top()) { 370f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::LDScript: 371f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(LDSCRIPT); 372f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 373f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::Expression: 374f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines BEGIN(EXPRESSION); 375f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 376f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::VersionScript: 377f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptFile::DynamicList: 378f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 379f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0 && "Unsupported script type!"); 380f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 381f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 382f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 383f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 384f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 38537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} /* namespace mcld */ 386f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 38704c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#ifdef __clang__ 38804c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#pragma clang diagnostic pop 38904c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines#endif 39004c59f3b00def22b7c75f5a490c323cec58a7c71Stephen Hines 391f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#ifdef yylex 392f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#undef yylex 393f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#endif 394f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 395f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesint yyFlexLexer::yylex() 396f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 397f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return 0; 398f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 399f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 400