X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gold%2Fscript.cc;h=d88758d077c54f438457c58c573e80063b78550c;hb=196535a69c8568342e62fdf5e3f5ade04470fd6a;hp=d6aa7b250a4c6ecc5719d0ec99c6ddec5375eba7;hpb=f224a3c59068fc8060c261d329f54bdc7374d63a;p=deliverable%2Fbinutils-gdb.git diff --git a/gold/script.cc b/gold/script.cc index d6aa7b250a..d88758d077 100644 --- a/gold/script.cc +++ b/gold/script.cc @@ -1,6 +1,6 @@ // script.cc -- handle linker scripts for gold. -// Copyright (C) 2006-2016 Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -764,12 +764,6 @@ Lex::get_token(const char** pp) while (true) { - if (*p == '\0') - { - *pp = p; - return this->make_eof_token(p); - } - // Skip whitespace quickly. while (*p == ' ' || *p == '\t' || *p == '\r') ++p; @@ -782,8 +776,18 @@ Lex::get_token(const char** pp) continue; } + char c0 = *p; + + if (c0 == '\0') + { + *pp = p; + return this->make_eof_token(p); + } + + char c1 = p[1]; + // Skip C style comments. - if (p[0] == '/' && p[1] == '*') + if (c0 == '/' && c1 == '*') { int lineno = this->lineno_; int charpos = p - this->linestart_ + 1; @@ -797,7 +801,7 @@ Lex::get_token(const char** pp) } // Skip line comments. - if (*p == '#') + if (c0 == '#') { *pp = p + 1; if (!this->skip_line_comment(pp)) @@ -807,7 +811,7 @@ Lex::get_token(const char** pp) } // Check for a name. - if (this->can_start_name(p[0], p[1])) + if (this->can_start_name(c0, c1)) return this->gather_token(Token::TOKEN_STRING, &Lex::can_continue_name, p, p + 1, pp); @@ -820,35 +824,38 @@ Lex::get_token(const char** pp) return this->gather_quoted_string(pp); } + // Be careful not to lookahead past the end of the buffer. + char c2 = (c1 == '\0' ? '\0' : p[2]); + // Check for a number. - if (this->can_start_hex(p[0], p[1], p[2])) + if (this->can_start_hex(c0, c1, c2)) return this->gather_token(Token::TOKEN_INTEGER, &Lex::can_continue_hex, p, p + 3, pp); - if (Lex::can_start_number(p[0])) + if (Lex::can_start_number(c0)) return this->gather_token(Token::TOKEN_INTEGER, &Lex::can_continue_number, p, p + 1, pp); // Check for operators. - int opcode = Lex::three_char_operator(p[0], p[1], p[2]); + int opcode = Lex::three_char_operator(c0, c1, c2); if (opcode != 0) { *pp = p + 3; return this->make_token(opcode, p); } - opcode = Lex::two_char_operator(p[0], p[1]); + opcode = Lex::two_char_operator(c0, c1); if (opcode != 0) { *pp = p + 2; return this->make_token(opcode, p); } - opcode = Lex::one_char_operator(p[0]); + opcode = Lex::one_char_operator(c0); if (opcode != 0) { *pp = p + 1; @@ -1105,6 +1112,29 @@ Script_options::is_pending_assignment(const char* name) return false; } +// Populates the set with symbols defined in defsym LHS. + +void Script_options::find_defsym_defs(Unordered_set& defsym_set) +{ + for (Symbol_assignments::const_iterator p = this->symbol_assignments_.begin(); + p != this->symbol_assignments_.end(); + ++p) + { + defsym_set.insert((*p)->name()); + } +} + +void +Script_options::set_defsym_uses_in_real_elf(Symbol_table* symtab) const +{ + for (Symbol_assignments::const_iterator p = this->symbol_assignments_.begin(); + p != this->symbol_assignments_.end(); + ++p) + { + (*p)->value()->set_expr_sym_in_real_elf(symtab); + } +} + // Add a symbol to be defined. void @@ -1755,6 +1785,7 @@ script_keyword_parsecodes[] = { "FLOAT", FLOAT }, { "FORCE_COMMON_ALLOCATION", FORCE_COMMON_ALLOCATION }, { "GROUP", GROUP }, + { "HIDDEN", HIDDEN }, { "HLL", HLL }, { "INCLUDE", INCLUDE }, { "INFO", INFO }, @@ -2696,7 +2727,7 @@ script_add_library(void* closurev, const char* name, size_t length) if (name_string[0] != 'l') gold_error(_("library name must be prefixed with -l")); - + Input_file_argument file(name_string.c_str() + 1, Input_file_argument::INPUT_FILE_TYPE_LIBRARY, "", false,