Compare commits

..

3 Commits

4 changed files with 32 additions and 49 deletions

View File

@@ -49,7 +49,7 @@ else()
-fsanitize=float-divide-by-zero) -fsanitize=float-divide-by-zero)
add_compile_options(${SAN_FLAGS}) add_compile_options(${SAN_FLAGS})
add_link_options(${SAN_FLAGS}) add_link_options(${SAN_FLAGS})
add_definitions(-D_GLIBCXX_ASSERTIONS) add_definitions(-D_GLIBCXX_ASSERTIONS -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG)
# A non-zero optimization level is desired in debug mode, but allow overriding it nonetheless # A non-zero optimization level is desired in debug mode, but allow overriding it nonetheless
set(CMAKE_CXX_FLAGS_DEBUG "-g -Og -fno-omit-frame-pointer -fno-optimize-sibling-calls ${CMAKE_CXX_FLAGS_DEBUG}" set(CMAKE_CXX_FLAGS_DEBUG "-g -Og -fno-omit-frame-pointer -fno-optimize-sibling-calls ${CMAKE_CXX_FLAGS_DEBUG}"
CACHE STRING "" FORCE) CACHE STRING "" FORCE)

View File

@@ -222,8 +222,8 @@ develop:
-Wformat=2 -Wformat-overflow=2 -Wformat-truncation=1 \ -Wformat=2 -Wformat-overflow=2 -Wformat-truncation=1 \
-Wno-format-nonliteral -Wno-strict-overflow -Wno-unused-but-set-variable \ -Wno-format-nonliteral -Wno-strict-overflow -Wno-unused-but-set-variable \
-Wno-type-limits -Wno-tautological-constant-out-of-range-compare -Wvla \ -Wno-type-limits -Wno-tautological-constant-out-of-range-compare -Wvla \
-D_GLIBCXX_ASSERTIONS -fsanitize=address -fsanitize=undefined \ -D_GLIBCXX_ASSERTIONS -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG \
-fsanitize=float-divide-by-zero" \ -fsanitize=address -fsanitize=undefined -fsanitize=float-divide-by-zero" \
CXXFLAGS="-ggdb3 -Og -fno-omit-frame-pointer -fno-optimize-sibling-calls" CXXFLAGS="-ggdb3 -Og -fno-omit-frame-pointer -fno-optimize-sibling-calls"
# Target used in development to debug with gdb. # Target used in development to debug with gdb.

View File

@@ -208,50 +208,37 @@ static std::optional<size_t> getPlacement(Section const &section, MemoryLocation
} }
static std::string getSectionDescription(Section const &section) { static std::string getSectionDescription(Section const &section) {
std::string where; std::string description =
"\"" + section.name + "\" (" + sectionTypeInfo[section.type].name + " section) ";
char bank[8], addr[8], mask[8], offset[8];
if (section.isBankFixed && sectTypeBanks(section.type) != 1) { if (section.isBankFixed && sectTypeBanks(section.type) != 1) {
char bank[8];
snprintf(bank, sizeof(bank), "%02" PRIx32, section.bank); snprintf(bank, sizeof(bank), "%02" PRIx32, section.bank);
}
if (section.isAddressFixed) {
snprintf(addr, sizeof(addr), "%04" PRIx16, section.org);
}
if (section.isAlignFixed) {
snprintf(mask, sizeof(mask), "%" PRIx16, static_cast<uint16_t>(~section.alignMask));
snprintf(offset, sizeof(offset), "%" PRIx16, section.alignOfs);
}
if (section.isBankFixed && sectTypeBanks(section.type) != 1) {
if (section.isAddressFixed) { if (section.isAddressFixed) {
where = "at $"; char addr[8];
where += bank; snprintf(addr, sizeof(addr), "%04" PRIx16, section.org);
where += ":"; description = description + "at $" + bank + ":" + addr;
where += addr;
} else if (section.isAlignFixed) { } else if (section.isAlignFixed) {
where = "in bank $"; char mask[8];
where += bank; snprintf(mask, sizeof(mask), "%" PRIx16, static_cast<uint16_t>(~section.alignMask));
where += " with align mask $"; description = description + "in bank $" + bank + " with align mask $" + mask;
where += mask;
} else { } else {
where = "in bank $"; description = description + "in bank $" + bank;
where += bank;
} }
} else { } else {
if (section.isAddressFixed) { if (section.isAddressFixed) {
where = "at address $"; char addr[8];
where += addr; snprintf(addr, sizeof(addr), "%04" PRIx16, section.org);
description = description + "at address $" + addr;
} else if (section.isAlignFixed) { } else if (section.isAlignFixed) {
where = "with align mask $"; char mask[8], offset[8];
where += mask; snprintf(mask, sizeof(mask), "%" PRIx16, static_cast<uint16_t>(~section.alignMask));
where += " and offset $"; snprintf(offset, sizeof(offset), "%" PRIx16, section.alignOfs);
where += offset; description = description + "with align mask $" + mask + " and offset $" + offset;
} else { } else {
where = "anywhere"; description = description + "anywhere";
} }
} }
return description;
return where;
} }
// Places a section in a suitable location, or error out if it fails to. // Places a section in a suitable location, or error out if it fails to.
@@ -310,19 +297,11 @@ static void placeSection(Section &section) {
if (!section.isBankFixed || !section.isAddressFixed) { if (!section.isBankFixed || !section.isAddressFixed) {
// If a section failed to go to several places, nothing we can report // If a section failed to go to several places, nothing we can report
fatal( fatal("Unable to place %s", getSectionDescription(section).c_str());
"Unable to place \"%s\" (%s section) %s",
section.name.c_str(),
sectionTypeInfo[section.type].name.c_str(),
getSectionDescription(section).c_str()
);
} else if (section.org + section.size > sectTypeEndAddr(section.type) + 1) { } else if (section.org + section.size > sectTypeEndAddr(section.type) + 1) {
// If the section just can't fit the bank, report that // If the section just can't fit the bank, report that
fatal( fatal(
"Unable to place \"%s\" (%s section) %s: section runs past end of region ($%04x > " "Unable to place %s: section runs past end of region ($%04x > $%04x)",
"$%04x)",
section.name.c_str(),
sectionTypeInfo[section.type].name.c_str(),
getSectionDescription(section).c_str(), getSectionDescription(section).c_str(),
section.org + section.size, section.org + section.size,
sectTypeEndAddr(section.type) + 1 sectTypeEndAddr(section.type) + 1
@@ -330,9 +309,7 @@ static void placeSection(Section &section) {
} else { } else {
// Otherwise there is overlap with another section // Otherwise there is overlap with another section
fatal( fatal(
"Unable to place \"%s\" (%s section) %s: section overlaps with \"%s\"", "Unable to place %s: section overlaps with \"%s\"",
section.name.c_str(),
sectionTypeInfo[section.type].name.c_str(),
getSectionDescription(section).c_str(), getSectionDescription(section).c_str(),
out_OverlappingSection(section)->name.c_str() out_OverlappingSection(section)->name.c_str()
); );

View File

@@ -14,7 +14,13 @@
#if !defined(NDEBUG) && defined(__SANITIZE_ADDRESS__) && !defined(__APPLE__) #if !defined(NDEBUG) && defined(__SANITIZE_ADDRESS__) && !defined(__APPLE__)
extern "C" { extern "C" {
char const *__asan_default_options(void) { char const *__asan_default_options(void) {
return "detect_leaks=1"; return "detect_leaks=1"
":detect_stack_use_after_return=1"
":detect_invalid_pointer_pairs=2"
":check_initialization_order=1"
":strict_init_order=1"
":strict_string_checks=1"
":print_legend=0";
} }
} }
#endif #endif