#include "config.h"
#undef FLOAT
#undef FFS
#include "system.h"
#include "rtl.h"
#include "insn-attr.h"
#include "insn-config.h"
#include "input.h"
#include "toplev.h"
#include "intl.h"
#include "diagnostic.h"
static void file_and_line_for_asm PARAMS ((rtx, const char **, int *));
static void diagnostic_for_asm PARAMS ((rtx, const char *, va_list *, int));
static void
file_and_line_for_asm (insn, pfile, pline)
rtx insn;
const char **pfile;
int *pline;
{
rtx body = PATTERN (insn);
rtx asmop;
if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
asmop = SET_SRC (body);
else if (GET_CODE (body) == ASM_OPERANDS)
asmop = body;
else if (GET_CODE (body) == PARALLEL
&& GET_CODE (XVECEXP (body, 0, 0)) == SET)
asmop = SET_SRC (XVECEXP (body, 0, 0));
else if (GET_CODE (body) == PARALLEL
&& GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
asmop = XVECEXP (body, 0, 0);
else
asmop = NULL;
if (asmop)
{
*pfile = ASM_OPERANDS_SOURCE_FILE (asmop);
*pline = ASM_OPERANDS_SOURCE_LINE (asmop);
}
else
{
*pfile = input_filename;
*pline = lineno;
}
}
static void
diagnostic_for_asm (insn, msg, args_ptr, warn)
rtx insn;
const char *msg;
va_list *args_ptr;
int warn;
{
diagnostic_context dc;
set_diagnostic_context (&dc, msg, args_ptr, NULL, 0, warn);
file_and_line_for_asm (insn, &diagnostic_file_location (&dc),
&diagnostic_line_location (&dc));
report_diagnostic (&dc);
}
void
error_for_asm VPARAMS ((rtx insn, const char *msgid, ...))
{
VA_OPEN (ap, msgid);
VA_FIXEDARG (ap, rtx, insn);
VA_FIXEDARG (ap, const char *, msgid);
diagnostic_for_asm (insn, msgid, &ap, 0);
VA_CLOSE (ap);
}
void
warning_for_asm VPARAMS ((rtx insn, const char *msgid, ...))
{
VA_OPEN (ap, msgid);
VA_FIXEDARG (ap, rtx, insn);
VA_FIXEDARG (ap, const char *, msgid);
diagnostic_for_asm (insn, msgid, &ap, 1);
VA_CLOSE (ap);
}
void
_fatal_insn (msgid, insn, file, line, function)
const char *msgid;
rtx insn;
const char *file;
int line;
const char *function;
{
error ("%s", _(msgid));
errorcount--;
debug_rtx (insn);
fancy_abort (file, line, function);
}
void
_fatal_insn_not_found (insn, file, line, function)
rtx insn;
const char *file;
int line;
const char *function;
{
if (INSN_CODE (insn) < 0)
_fatal_insn ("unrecognizable insn:", insn, file, line, function);
else
_fatal_insn ("insn does not satisfy its constraints:",
insn, file, line, function);
}