/*********************************************************************** * toolchain/nxflat/reloc-macros.h * * Generic relocation support for BFD. * Copyright (C) 1998 Free Software Foundation, Inc. * * This file is part of BFD, the Binary File Descriptor library. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * *********************************************************************** * * These macros are used by the various *.h target specific header * files to either generate an enum containing all the known relocations * for that target, or if RELOC_MACROS_GEN_FUNC is defined, a recognition * function is generated instead. (This is used by binutils/readelf.c) * * Given a header file like this: * * START_RELOC_NUMBERS (foo) * RELOC_NUMBER (R_foo_NONE, 0) * RELOC_NUMBER (R_foo_32, 1) * FAKE_RELOC (R_foo_illegal, 2) * EMPTY_RELOC (R_foo_max) * END_RELOC_NUMBERS * * Then the following will be produced by default (ie if * RELOC_MACROS_GEN_FUNC is *not* defined). * * enum foo * { * foo = -1, * R_foo_NONE = 0, * R_foo_32 = 1, * R_foo_illegal = 2, * R_foo_max * }; * * If RELOC_MACROS_GEN_FUNC *is* defined, then instead the * following function will be generated: * * static const char * foo PARAMS ((unsigned long rtype)); * static const char * * foo (rtype) * unsigned long rtype; * { * switch (rtype) * { * case 0: return "R_foo_NONE"; * case 1: return "R_foo_32"; * default: return NULL; * } * } ***********************************************************************/ #ifndef _RELOC_MACROS_H # define _RELOC_MACROS_H # ifdef RELOC_MACROS_GEN_FUNC /* This function takes the relocation number and returns the * string version name of the name of that relocation. If * the relocation is not recognised, NULL is returned. */ # define START_RELOC_NUMBERS(name) \ static const char * name PARAMS ((unsigned long rtype)); \ static const char * \ name (rtype) \ unsigned long rtype; \ { \ switch (rtype) \ { # ifdef __STDC__ # define RELOC_NUMBER(name, number) case number : return #name ; # else # define RELOC_NUMBER(name, number) case number : return "name" ; # endif # define FAKE_RELOC(name, number) # define EMPTY_RELOC(name) # define END_RELOC_NUMBERS \ default: return NULL; \ } \ } # else /* Default to generating enum. */ /* Some compilers cannot cope with an enum that ends with a trailing * comma, so START_RELOC_NUMBERS creates a fake reloc entry, (initialised * to -1 so that the first real entry will still default to 0). Further * entries then prepend a comma to their definitions, creating a list * of enumerator entries that will satisfy these compilers. */ # ifdef __STDC__ # define START_RELOC_NUMBERS(name) enum name { _##name = -1 # else # define START_RELOC_NUMBERS(name) enum name { name = -1 # endif # define RELOC_NUMBER(name, number) , name = number # define FAKE_RELOC(name, number) , name = number # define EMPTY_RELOC(name) , name # define END_RELOC_NUMBERS }; # endif #endif /* RELOC_MACROS_H */