Skip to content

Commit

Permalink
[lldb] For native compiles, check signal numbers are correct when add…
Browse files Browse the repository at this point in the history
…ing codes

Reviewed By: arichardson, emaste

Differential Revision: https://reviews.llvm.org/D146285
  • Loading branch information
DavidSpickett committed Mar 21, 2023
1 parent 88e5206 commit 392d9eb
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 87 deletions.
63 changes: 33 additions & 30 deletions lldb/source/Plugins/Platform/FreeBSD/FreeBSDSignals.cpp
Expand Up @@ -11,13 +11,16 @@
#ifdef __FreeBSD__
#include <csignal>

#define ADD_SIGCODE(signal, name, value, ...) \
static_assert(name == value, "Value mismatch for signal code " #name); \
AddSignalCode(signal, value, __VA_ARGS__)
#define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
static_assert(signal_name == signal_value, \
"Value mismatch for signal number " #signal_name); \
static_assert(code_name == code_value, \
"Value mismatch for signal code " #code_name); \
AddSignalCode(signal_value, code_value, __VA_ARGS__)
#else
#define ADD_SIGCODE(signal, name, value, ...) \
AddSignalCode(signal, value, __VA_ARGS__)
#endif /* ifdef __FreeBSD__ */
#define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
AddSignalCode(signal_value, code_value, __VA_ARGS__)
#endif /* ifdef __FreeBSD */

using namespace lldb_private;

Expand All @@ -28,38 +31,38 @@ void FreeBSDSignals::Reset() {

// clang-format off
// SIGILL
ADD_SIGCODE(4, ILL_ILLOPC, 1, "illegal opcode");
ADD_SIGCODE(4, ILL_ILLOPN, 2, "illegal operand");
ADD_SIGCODE(4, ILL_ILLADR, 3, "illegal addressing mode");
ADD_SIGCODE(4, ILL_ILLTRP, 4, "illegal trap");
ADD_SIGCODE(4, ILL_PRVOPC, 5, "privileged opcode");
ADD_SIGCODE(4, ILL_PRVREG, 6, "privileged register");
ADD_SIGCODE(4, ILL_COPROC, 7, "coprocessor error");
ADD_SIGCODE(4, ILL_BADSTK, 8, "internal stack error");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPC, 1, "illegal opcode");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPN, 2, "illegal operand");
ADD_SIGCODE(SIGILL, 4, ILL_ILLADR, 3, "illegal addressing mode");
ADD_SIGCODE(SIGILL, 4, ILL_ILLTRP, 4, "illegal trap");
ADD_SIGCODE(SIGILL, 4, ILL_PRVOPC, 5, "privileged opcode");
ADD_SIGCODE(SIGILL, 4, ILL_PRVREG, 6, "privileged register");
ADD_SIGCODE(SIGILL, 4, ILL_COPROC, 7, "coprocessor error");
ADD_SIGCODE(SIGILL, 4, ILL_BADSTK, 8, "internal stack error");

// SIGFPE
ADD_SIGCODE(8, FPE_INTOVF, 1, "integer overflow");
ADD_SIGCODE(8, FPE_INTDIV, 2, "integer divide by zero");
ADD_SIGCODE(8, FPE_FLTDIV, 3, "floating point divide by zero");
ADD_SIGCODE(8, FPE_FLTOVF, 4, "floating point overflow");
ADD_SIGCODE(8, FPE_FLTUND, 5, "floating point underflow");
ADD_SIGCODE(8, FPE_FLTRES, 6, "floating point inexact result");
ADD_SIGCODE(8, FPE_FLTINV, 7, "invalid floating point operation");
ADD_SIGCODE(8, FPE_FLTSUB, 8, "subscript out of range");
ADD_SIGCODE(8, FPE_FLTIDO, 9, "input denormal operation");
ADD_SIGCODE(SIGFPE, 8, FPE_INTOVF, 1, "integer overflow");
ADD_SIGCODE(SIGFPE, 8, FPE_INTDIV, 2, "integer divide by zero");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTDIV, 3, "floating point divide by zero");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTOVF, 4, "floating point overflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTUND, 5, "floating point underflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTRES, 6, "floating point inexact result");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTINV, 7, "invalid floating point operation");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTSUB, 8, "subscript out of range");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTIDO, 9, "input denormal operation");

// SIGBUS
ADD_SIGCODE(10, BUS_ADRALN, 1, "invalid address alignment");
ADD_SIGCODE(10, BUS_ADRERR, 2, "nonexistent physical address");
ADD_SIGCODE(10, BUS_OBJERR, 3, "object-specific hardware error");
ADD_SIGCODE(10, BUS_OOMERR, 100, "no memory");
ADD_SIGCODE(SIGBUS, 10, BUS_ADRALN, 1, "invalid address alignment");
ADD_SIGCODE(SIGBUS, 10, BUS_ADRERR, 2, "nonexistent physical address");
ADD_SIGCODE(SIGBUS, 10, BUS_OBJERR, 3, "object-specific hardware error");
ADD_SIGCODE(SIGBUS, 10, BUS_OOMERR, 100, "no memory");

// SIGSEGV
ADD_SIGCODE(11, SEGV_MAPERR, 1, "address not mapped to object",
ADD_SIGCODE(SIGSEGV, 11, SEGV_MAPERR, 1, "address not mapped to object",
SignalCodePrintOption::Address);
ADD_SIGCODE(11, SEGV_ACCERR, 2, "invalid permissions for mapped object",
ADD_SIGCODE(SIGSEGV, 11, SEGV_ACCERR, 2, "invalid permissions for mapped object",
SignalCodePrintOption::Address);
ADD_SIGCODE(11, SEGV_PKUERR, 100, "PKU violation",
ADD_SIGCODE(SIGSEGV, 11, SEGV_PKUERR, 100, "PKU violation",
SignalCodePrintOption::Address);

// SIGNO NAME SUPPRESS STOP NOTIFY DESCRIPTION
Expand Down
63 changes: 33 additions & 30 deletions lldb/source/Plugins/Platform/Linux/LinuxSignals.cpp
Expand Up @@ -21,12 +21,15 @@
#define SEGV_MTESERR 9
#endif

#define ADD_SIGCODE(signal, name, value, ...) \
static_assert(name == value, "Value mismatch for signal code " #name); \
AddSignalCode(signal, value, __VA_ARGS__)
#define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
static_assert(signal_name == signal_value, \
"Value mismatch for signal number " #signal_name); \
static_assert(code_name == code_value, \
"Value mismatch for signal code " #code_name); \
AddSignalCode(signal_value, code_value, __VA_ARGS__)
#else
#define ADD_SIGCODE(signal, name, value, ...) \
AddSignalCode(signal, value, __VA_ARGS__)
#define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
AddSignalCode(signal_value, code_value, __VA_ARGS__)
#endif /* ifdef __linux__ */

using namespace lldb_private;
Expand All @@ -43,45 +46,45 @@ void LinuxSignals::Reset() {
AddSignal(3, "SIGQUIT", false, true, true, "quit");

AddSignal(4, "SIGILL", false, true, true, "illegal instruction");
ADD_SIGCODE(4, ILL_ILLOPC, 1, "illegal opcode");
ADD_SIGCODE(4, ILL_ILLOPN, 2, "illegal operand");
ADD_SIGCODE(4, ILL_ILLADR, 3, "illegal addressing mode");
ADD_SIGCODE(4, ILL_ILLTRP, 4, "illegal trap");
ADD_SIGCODE(4, ILL_PRVOPC, 5, "privileged opcode");
ADD_SIGCODE(4, ILL_PRVREG, 6, "privileged register");
ADD_SIGCODE(4, ILL_COPROC, 7, "coprocessor error");
ADD_SIGCODE(4, ILL_BADSTK, 8, "internal stack error");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPC, 1, "illegal opcode");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPN, 2, "illegal operand");
ADD_SIGCODE(SIGILL, 4, ILL_ILLADR, 3, "illegal addressing mode");
ADD_SIGCODE(SIGILL, 4, ILL_ILLTRP, 4, "illegal trap");
ADD_SIGCODE(SIGILL, 4, ILL_PRVOPC, 5, "privileged opcode");
ADD_SIGCODE(SIGILL, 4, ILL_PRVREG, 6, "privileged register");
ADD_SIGCODE(SIGILL, 4, ILL_COPROC, 7, "coprocessor error");
ADD_SIGCODE(SIGILL, 4, ILL_BADSTK, 8, "internal stack error");

AddSignal(5, "SIGTRAP", true, true, true, "trace trap (not reset when caught)");
AddSignal(6, "SIGABRT", false, true, true, "abort()/IOT trap", "SIGIOT");

AddSignal(7, "SIGBUS", false, true, true, "bus error");
ADD_SIGCODE(7, BUS_ADRALN, 1, "illegal alignment");
ADD_SIGCODE(7, BUS_ADRERR, 2, "illegal address");
ADD_SIGCODE(7, BUS_OBJERR, 3, "hardware error");
ADD_SIGCODE(SIGBUS, 7, BUS_ADRALN, 1, "illegal alignment");
ADD_SIGCODE(SIGBUS, 7, BUS_ADRERR, 2, "illegal address");
ADD_SIGCODE(SIGBUS, 7, BUS_OBJERR, 3, "hardware error");

AddSignal(8, "SIGFPE", false, true, true, "floating point exception");
ADD_SIGCODE(8, FPE_INTDIV, 1, "integer divide by zero");
ADD_SIGCODE(8, FPE_INTOVF, 2, "integer overflow");
ADD_SIGCODE(8, FPE_FLTDIV, 3, "floating point divide by zero");
ADD_SIGCODE(8, FPE_FLTOVF, 4, "floating point overflow");
ADD_SIGCODE(8, FPE_FLTUND, 5, "floating point underflow");
ADD_SIGCODE(8, FPE_FLTRES, 6, "floating point inexact result");
ADD_SIGCODE(8, FPE_FLTINV, 7, "floating point invalid operation");
ADD_SIGCODE(8, FPE_FLTSUB, 8, "subscript out of range");
ADD_SIGCODE(SIGFPE, 8, FPE_INTDIV, 1, "integer divide by zero");
ADD_SIGCODE(SIGFPE, 8, FPE_INTOVF, 2, "integer overflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTDIV, 3, "floating point divide by zero");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTOVF, 4, "floating point overflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTUND, 5, "floating point underflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTRES, 6, "floating point inexact result");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTINV, 7, "floating point invalid operation");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTSUB, 8, "subscript out of range");

AddSignal(9, "SIGKILL", false, true, true, "kill");
AddSignal(10, "SIGUSR1", false, true, true, "user defined signal 1");

AddSignal(11, "SIGSEGV", false, true, true, "segmentation violation");
ADD_SIGCODE(11, SEGV_MAPERR, 1, "address not mapped to object", SignalCodePrintOption::Address);
ADD_SIGCODE(11, SEGV_ACCERR, 2, "invalid permissions for mapped object", SignalCodePrintOption::Address);
ADD_SIGCODE(11, SEGV_BNDERR, 3, "failed address bounds checks", SignalCodePrintOption::Bounds);
ADD_SIGCODE(11, SEGV_MTEAERR, 8, "async tag check fault");
ADD_SIGCODE(11, SEGV_MTESERR, 9, "sync tag check fault", SignalCodePrintOption::Address);
ADD_SIGCODE(SIGSEGV, 11, SEGV_MAPERR, 1, "address not mapped to object", SignalCodePrintOption::Address);
ADD_SIGCODE(SIGSEGV, 11, SEGV_ACCERR, 2, "invalid permissions for mapped object", SignalCodePrintOption::Address);
ADD_SIGCODE(SIGSEGV, 11, SEGV_BNDERR, 3, "failed address bounds checks", SignalCodePrintOption::Bounds);
ADD_SIGCODE(SIGSEGV, 11, SEGV_MTEAERR, 8, "async tag check fault");
ADD_SIGCODE(SIGSEGV, 11, SEGV_MTESERR, 9, "sync tag check fault", SignalCodePrintOption::Address);
// Some platforms will occasionally send nonstandard spurious SI_KERNEL
// codes. One way to get this is via unaligned SIMD loads. Treat it as invalid address.
ADD_SIGCODE(11, SI_KERNEL, 0x80, "invalid address", SignalCodePrintOption::Address);
ADD_SIGCODE(SIGSEGV, 11, SI_KERNEL, 0x80, "invalid address", SignalCodePrintOption::Address);

AddSignal(12, "SIGUSR2", false, true, true, "user defined signal 2");
AddSignal(13, "SIGPIPE", false, true, true, "write to pipe with reading end closed");
Expand Down
57 changes: 30 additions & 27 deletions lldb/source/Plugins/Platform/NetBSD/NetBSDSignals.cpp
Expand Up @@ -11,13 +11,16 @@
#ifdef __NetBSD__
#include <csignal>

#define ADD_SIGCODE(signal, name, value, ...) \
static_assert(name == value, "Value mismatch for signal code " #name); \
AddSignalCode(signal, value, __VA_ARGS__)
#define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
static_assert(signal_name == signal_value, \
"Value mismatch for signal number " #signal_name); \
static_assert(code_name == code_value, \
"Value mismatch for signal code " #code_name); \
AddSignalCode(signal_value, code_value, __VA_ARGS__)
#else
#define ADD_SIGCODE(signal, name, value, ...) \
AddSignalCode(signal, value, __VA_ARGS__)
#endif /* ifdef __NetBSD__ */
#define ADD_SIGCODE(signal_name, signal_value, code_name, code_value, ...) \
AddSignalCode(signal_value, code_value, __VA_ARGS__)
#endif /* ifdef __NetBSD */

using namespace lldb_private;

Expand All @@ -28,34 +31,34 @@ void NetBSDSignals::Reset() {

// clang-format off
// SIGILL
ADD_SIGCODE(4, ILL_ILLOPC, 1, "illegal opcode");
ADD_SIGCODE(4, ILL_ILLOPN, 2, "illegal operand");
ADD_SIGCODE(4, ILL_ILLADR, 3, "illegal addressing mode");
ADD_SIGCODE(4, ILL_ILLTRP, 4, "illegal trap");
ADD_SIGCODE(4, ILL_PRVOPC, 5, "privileged opcode");
ADD_SIGCODE(4, ILL_PRVREG, 6, "privileged register");
ADD_SIGCODE(4, ILL_COPROC, 7, "coprocessor error");
ADD_SIGCODE(4, ILL_BADSTK, 8, "internal stack error");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPC, 1, "illegal opcode");
ADD_SIGCODE(SIGILL, 4, ILL_ILLOPN, 2, "illegal operand");
ADD_SIGCODE(SIGILL, 4, ILL_ILLADR, 3, "illegal addressing mode");
ADD_SIGCODE(SIGILL, 4, ILL_ILLTRP, 4, "illegal trap");
ADD_SIGCODE(SIGILL, 4, ILL_PRVOPC, 5, "privileged opcode");
ADD_SIGCODE(SIGILL, 4, ILL_PRVREG, 6, "privileged register");
ADD_SIGCODE(SIGILL, 4, ILL_COPROC, 7, "coprocessor error");
ADD_SIGCODE(SIGILL, 4, ILL_BADSTK, 8, "internal stack error");

// SIGFPE
ADD_SIGCODE(8, FPE_INTDIV, 1, "integer divide by zero");
ADD_SIGCODE(8, FPE_INTOVF, 2, "integer overflow");
ADD_SIGCODE(8, FPE_FLTDIV, 3, "floating point divide by zero");
ADD_SIGCODE(8, FPE_FLTOVF, 4, "floating point overflow");
ADD_SIGCODE(8, FPE_FLTUND, 5, "floating point underflow");
ADD_SIGCODE(8, FPE_FLTRES, 6, "floating point inexact result");
ADD_SIGCODE(8, FPE_FLTINV, 7, "invalid floating point operation");
ADD_SIGCODE(8, FPE_FLTSUB, 8, "subscript out of range");
ADD_SIGCODE(SIGFPE, 8, FPE_INTDIV, 1, "integer divide by zero");
ADD_SIGCODE(SIGFPE, 8, FPE_INTOVF, 2, "integer overflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTDIV, 3, "floating point divide by zero");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTOVF, 4, "floating point overflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTUND, 5, "floating point underflow");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTRES, 6, "floating point inexact result");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTINV, 7, "invalid floating point operation");
ADD_SIGCODE(SIGFPE, 8, FPE_FLTSUB, 8, "subscript out of range");

// SIGBUS
ADD_SIGCODE(10, BUS_ADRALN, 1, "invalid address alignment");
ADD_SIGCODE(10, BUS_ADRERR, 2, "non-existent physical address");
ADD_SIGCODE(10, BUS_OBJERR, 3, "object specific hardware error");
ADD_SIGCODE(SIGBUS, 10, BUS_ADRALN, 1, "invalid address alignment");
ADD_SIGCODE(SIGBUS, 10, BUS_ADRERR, 2, "non-existent physical address");
ADD_SIGCODE(SIGBUS, 10, BUS_OBJERR, 3, "object specific hardware error");

// SIGSEGV
ADD_SIGCODE(11, SEGV_MAPERR, 1, "address not mapped to object",
ADD_SIGCODE(SIGSEGV, 11, SEGV_MAPERR, 1, "address not mapped to object",
SignalCodePrintOption::Address);
ADD_SIGCODE(11, SEGV_ACCERR, 2, "invalid permissions for mapped object",
ADD_SIGCODE(SIGSEGV, 11, SEGV_ACCERR, 2, "invalid permissions for mapped object",
SignalCodePrintOption::Address);

// SIGNO NAME SUPPRESS STOP NOTIFY DESCRIPTION
Expand Down

0 comments on commit 392d9eb

Please sign in to comment.