1// tls.h -- Thread-Local Storage utility routines for gold -*- C++ -*- 2 3// Copyright (C) 2006-2017 Free Software Foundation, Inc. 4// Written by Ian Lance Taylor <iant@google.com>. 5 6// This file is part of gold. 7 8// This program is free software; you can redistribute it and/or modify 9// it under the terms of the GNU General Public License as published by 10// the Free Software Foundation; either version 3 of the License, or 11// (at your option) any later version. 12 13// This program is distributed in the hope that it will be useful, 14// but WITHOUT ANY WARRANTY; without even the implied warranty of 15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16// GNU General Public License for more details. 17 18// You should have received a copy of the GNU General Public License 19// along with this program; if not, write to the Free Software 20// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21// MA 02110-1301, USA. 22 23#ifndef GOLD_TLS_H 24#define GOLD_TLS_H 25 26#include "elfcpp.h" 27#include "reloc.h" 28 29namespace gold 30{ 31 32namespace tls 33{ 34 35// This is used for relocations that can be converted to a different, 36// more efficient type of relocation. 37 38enum Tls_optimization 39{ 40 TLSOPT_NONE, // Can not convert this relocation to a more efficient one. 41 TLSOPT_TO_LD, // Can convert General Dynamic to Local Dynamic. 42 TLSOPT_TO_LE, // Can convert GD or LD to Local-Exec. 43 TLSOPT_TO_IE, // Can convert GD or LD or LE to Initial-Exec. 44}; 45 46// Check the range for a TLS relocation. This is inlined for efficiency. 47 48template<int size, bool big_endian> 49inline void 50check_range(const Relocate_info<size, big_endian>* relinfo, 51 size_t relnum, 52 typename elfcpp::Elf_types<size>::Elf_Addr rel_offset, 53 section_size_type view_size, int off) 54{ 55 typename elfcpp::Elf_types<size>::Elf_Addr offset = rel_offset + off; 56 // Elf_Addr is unsigned, so this also tests for signed offset < 0. 57 if (offset > view_size) 58 gold_error_at_location(relinfo, relnum, rel_offset, 59 _("TLS relocation out of range")); 60} 61 62// Check the validity of a TLS relocation. This is like assert. 63 64template<int size, bool big_endian> 65inline void 66check_tls(const Relocate_info<size, big_endian>* relinfo, 67 size_t relnum, 68 typename elfcpp::Elf_types<size>::Elf_Addr rel_offset, 69 bool valid) 70{ 71 if (!valid) 72 gold_error_at_location(relinfo, relnum, rel_offset, 73 _("TLS relocation against invalid instruction")); 74} 75 76 77} // End namespace tls. 78 79} // End namespace gold. 80 81#endif // !defined(GOLD_TLS_H) 82