1/* RTL specific diagnostic subroutines for GCC 2 Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. 3 Contributed by Gabriel Dos Reis <gdr@codesourcery.com> 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify 8it under the terms of the GNU General Public License as published by 9the Free Software Foundation; either version 2, or (at your option) 10any later version. 11 12GCC is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING. If not, write to 19the Free Software Foundation, 51 Franklin Street, Fifth Floor, 20Boston, MA 02110-1301, USA. */ 21 22#include "config.h" 23#undef FLOAT /* This is for hpux. They should change hpux. */ 24#undef FFS /* Some systems define this in param.h. */ 25#include "system.h" 26#include "coretypes.h" 27#include "tm.h" 28#include "rtl.h" 29#include "insn-attr.h" 30#include "insn-config.h" 31#include "input.h" 32#include "toplev.h" 33#include "intl.h" 34#include "diagnostic.h" 35 36static location_t location_for_asm (rtx); 37static void diagnostic_for_asm (rtx, const char *, va_list *, diagnostic_t) ATTRIBUTE_GCC_DIAG(2,0); 38 39/* Figure the location of the given INSN. */ 40static location_t 41location_for_asm (rtx insn) 42{ 43 rtx body = PATTERN (insn); 44 rtx asmop; 45 location_t loc; 46 47 /* Find the (or one of the) ASM_OPERANDS in the insn. */ 48 if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS) 49 asmop = SET_SRC (body); 50 else if (GET_CODE (body) == ASM_OPERANDS) 51 asmop = body; 52 else if (GET_CODE (body) == PARALLEL 53 && GET_CODE (XVECEXP (body, 0, 0)) == SET) 54 asmop = SET_SRC (XVECEXP (body, 0, 0)); 55 else if (GET_CODE (body) == PARALLEL 56 && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS) 57 asmop = XVECEXP (body, 0, 0); 58 else 59 asmop = NULL; 60 61 if (asmop) 62#ifdef USE_MAPPED_LOCATION 63 loc = ASM_OPERANDS_SOURCE_LOCATION (asmop); 64#else 65 { 66 loc.file = ASM_OPERANDS_SOURCE_FILE (asmop); 67 loc.line = ASM_OPERANDS_SOURCE_LINE (asmop); 68 } 69#endif 70 else 71 loc = input_location; 72 return loc; 73} 74 75/* Report a diagnostic MESSAGE (an errror or a WARNING) at the line number 76 of the insn INSN. This is used only when INSN is an `asm' with operands, 77 and each ASM_OPERANDS records its own source file and line. */ 78static void 79diagnostic_for_asm (rtx insn, const char *msg, va_list *args_ptr, 80 diagnostic_t kind) 81{ 82 diagnostic_info diagnostic; 83 84 diagnostic_set_info (&diagnostic, msg, args_ptr, 85 location_for_asm (insn), kind); 86 report_diagnostic (&diagnostic); 87} 88 89void 90error_for_asm (rtx insn, const char *gmsgid, ...) 91{ 92 va_list ap; 93 94 va_start (ap, gmsgid); 95 diagnostic_for_asm (insn, gmsgid, &ap, DK_ERROR); 96 va_end (ap); 97} 98 99void 100warning_for_asm (rtx insn, const char *gmsgid, ...) 101{ 102 va_list ap; 103 104 va_start (ap, gmsgid); 105 diagnostic_for_asm (insn, gmsgid, &ap, DK_WARNING); 106 va_end (ap); 107} 108 109void 110_fatal_insn (const char *msgid, rtx insn, const char *file, int line, 111 const char *function) 112{ 113 error ("%s", _(msgid)); 114 115 /* The above incremented error_count, but isn't an error that we want to 116 count, so reset it here. */ 117 errorcount--; 118 119 debug_rtx (insn); 120 fancy_abort (file, line, function); 121} 122 123void 124_fatal_insn_not_found (rtx insn, const char *file, int line, 125 const char *function) 126{ 127 if (INSN_CODE (insn) < 0) 128 _fatal_insn ("unrecognizable insn:", insn, file, line, function); 129 else 130 _fatal_insn ("insn does not satisfy its constraints:", 131 insn, file, line, function); 132} 133