blob: e7c8b28e49fddbdd49ab4963ab9059cee4a8cd8f [file] [log] [blame]
Rui Ueyama794366a2017-02-14 04:47:05 +00001//===- ScriptLexer.h --------------------------------------------*- C++ -*-===//
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +00002//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Rui Ueyama794366a2017-02-14 04:47:05 +000010#ifndef LLD_ELF_SCRIPT_LEXER_H
11#define LLD_ELF_SCRIPT_LEXER_H
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000012
Rui Ueyama3f851702017-10-02 21:00:41 +000013#include "lld/Common/LLVM.h"
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000014#include "llvm/ADT/StringRef.h"
Eugene Leviant03ff0162016-11-21 15:49:56 +000015#include "llvm/Support/MemoryBuffer.h"
Benjamin Kramerbd521202016-06-03 16:57:13 +000016#include <utility>
Adhemerval Zanellab92a34e2016-04-06 21:33:18 +000017#include <vector>
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000018
19namespace lld {
20namespace elf {
21
Rui Ueyama794366a2017-02-14 04:47:05 +000022class ScriptLexer {
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000023public:
Rui Ueyama794366a2017-02-14 04:47:05 +000024 explicit ScriptLexer(MemoryBufferRef MB);
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000025
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000026 void setError(const Twine &Msg);
Eugene Leviant03ff0162016-11-21 15:49:56 +000027 void tokenize(MemoryBufferRef MB);
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000028 static StringRef skipSpace(StringRef S);
29 bool atEOF();
30 StringRef next();
Rui Ueyamaf5fce482017-03-09 19:23:00 +000031 StringRef peek();
Justin Bogner5424e7c2016-10-17 06:21:13 +000032 void skip();
Rui Ueyama83043f22016-10-17 16:01:53 +000033 bool consume(StringRef Tok);
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000034 void expect(StringRef Expect);
Rui Ueyamaf5fce482017-03-09 19:23:00 +000035 bool consumeLabel(StringRef Tok);
Rui Ueyamab5f1c3e2016-12-01 04:36:49 +000036 std::string getCurrentLocation();
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000037
Eugene Leviant03ff0162016-11-21 15:49:56 +000038 std::vector<MemoryBufferRef> MBs;
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000039 std::vector<StringRef> Tokens;
Rui Ueyama731a66a2017-02-15 19:58:17 +000040 bool InExpr = false;
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000041 size_t Pos = 0;
Eugene Leviant03ff0162016-11-21 15:49:56 +000042
43private:
Rui Ueyama731a66a2017-02-15 19:58:17 +000044 void maybeSplitExpr();
Rui Ueyamab5f1c3e2016-12-01 04:36:49 +000045 StringRef getLine();
46 size_t getLineNumber();
47 size_t getColumnNumber();
48
Rui Ueyama10091b02016-12-01 04:36:54 +000049 MemoryBufferRef getCurrentMB();
Adhemerval Zanellae77b5bf2016-04-06 20:59:11 +000050};
51
52} // namespace elf
53} // namespace lld
54
55#endif