#include "riscasm.h"
#include "symbol.h"
#include "token.h"
-
+#define DEF_REGRISC
+#include "riscregs.h"
// Function prototypes
void MakeSection(int, uint16_t);
if (evexpr(fup->expr, &eval, &eattr, &esym) != OK)
continue;
+ if (esym)
+ if (!(esym->sattr & DEFINED))
+ {
+ // If our expression still has an undefined symbol at this stage, it's bad news.
+ // The linker is never going to resolve the expression, so that's an error.
+ error("cannot export complex expression with unresloved symbol '%s'", esym->sname);
+ continue;
+ }
+
if ((CHECK_OPTS(OPT_PC_RELATIVE)) && (eattr & (DEFINED | REFERENCED | EQUATED)) == (DEFINED | REFERENCED))
{
error("relocation not allowed when o30 is enabled");
// In this instruction the PC is located a DWORD away
if (dw & FU_PCRELX)
eval += 2;
+
+ if ((int64_t)eval > 0x7fff || (int64_t)eval < -32768)
+ error(range_error);
}
else
{
}
else if ((dw & FUMASKRISC) == FU_REGONE)
{
+ eval -= REGRISC_R0;
if (eval > 31)
{
error("register one value out of range");
}
else if ((dw & FUMASKRISC) == FU_REGTWO)
{
+ eval -= REGRISC_R0;
if (eval > 31)
{
error("register two value out of range");