static std::string GetBitsSetting() { std::string bits = YGAS_OBJFMT_BITS; // Walk through bits_32 and bits_64 in parallel, ordering by command line // argument position. unsigned int bits32_pos = 0, bits32_num = 0; unsigned int bits64_pos = 0, bits64_num = 0; for (;;) { if (bits32_num < bits_32.size()) bits32_pos = bits_32.getPosition(bits32_num); else bits32_pos = 0; if (bits64_num < bits_64.size()) bits64_pos = bits_64.getPosition(bits64_num); else bits64_pos = 0; if (bits32_pos != 0 && (bits64_pos == 0 || bits32_pos < bits64_pos)) { // Handle bits32 option ++bits32_num; bits = "32"; } else if (bits64_pos != 0 && (bits32_pos == 0 || bits64_pos < bits32_pos)) { // Handle bits64 option ++bits64_num; bits = "64"; } else break; // we're done with the list } return bits; }
static void ConfigureObject(Object& object) { Object::Config& config = object.getConfig(); // Walk through execstack and noexecstack in parallel, ordering by command // line argument position. unsigned int exec_pos = 0, exec_num = 0; unsigned int noexec_pos = 0, noexec_num = 0; for (;;) { if (exec_num < execstack.size()) exec_pos = execstack.getPosition(exec_num); else exec_pos = 0; if (noexec_num < noexecstack.size()) noexec_pos = noexecstack.getPosition(noexec_num); else noexec_pos = 0; if (exec_pos != 0 && (noexec_pos == 0 || exec_pos < noexec_pos)) { // Handle exec option ++exec_num; config.ExecStack = true; config.NoExecStack = false; } else if (noexec_pos != 0 && (exec_pos == 0 || noexec_pos < exec_pos)) { // Handle noexec option ++noexec_num; config.ExecStack = false; config.NoExecStack = true; } else break; // we're done with the list } }
static void ApplyWarningSettings(DiagnosticsEngine& diags) { // Disable init-nobits and uninit-contents by default. diags.setDiagnosticGroupMapping("init-nobits", diag::MAP_IGNORE); diags.setDiagnosticGroupMapping("uninit-contents", diag::MAP_IGNORE); // Walk through inhibit_warnings, fatal_warnings, enable_warnings, and // no_signed_overflow in parallel, ordering by command line argument // position. unsigned int inhibit_pos = 0, inhibit_num = 0; unsigned int enable_pos = 0, enable_num = 0; unsigned int fatal_pos = 0, fatal_num = 0; unsigned int signed_pos = 0, signed_num = 0; for (;;) { if (inhibit_num < inhibit_warnings.size()) inhibit_pos = inhibit_warnings.getPosition(inhibit_num); else inhibit_pos = 0; if (enable_num < enable_warnings.size()) enable_pos = enable_warnings.getPosition(enable_num); else enable_pos = 0; if (fatal_num < fatal_warnings.size()) fatal_pos = fatal_warnings.getPosition(fatal_num); else fatal_pos = 0; if (signed_num < no_signed_overflow.size()) signed_pos = no_signed_overflow.getPosition(signed_num); else signed_pos = 0; if (inhibit_pos != 0 && (enable_pos == 0 || inhibit_pos < enable_pos) && (fatal_pos == 0 || inhibit_pos < fatal_pos) && (signed_pos == 0 || inhibit_pos < signed_pos)) { // Handle inhibit option ++inhibit_num; diags.setIgnoreAllWarnings(true); } else if (enable_pos != 0 && (inhibit_pos == 0 || enable_pos < inhibit_pos) && (fatal_pos == 0 || enable_pos < fatal_pos) && (signed_pos == 0 || enable_pos < signed_pos)) { // Handle enable option ++enable_num; diags.setIgnoreAllWarnings(false); diags.setWarningsAsErrors(false); diags.setDiagnosticGroupMapping("signed-overflow", diag::MAP_WARNING); } else if (fatal_pos != 0 && (enable_pos == 0 || fatal_pos < enable_pos) && (inhibit_pos == 0 || fatal_pos < inhibit_pos) && (signed_pos == 0 || fatal_pos < signed_pos)) { // Handle fatal option ++fatal_num; diags.setWarningsAsErrors(true); } else if (signed_pos != 0 && (enable_pos == 0 || signed_pos < enable_pos) && (fatal_pos == 0 || signed_pos < fatal_pos) && (inhibit_pos == 0 || signed_pos < inhibit_pos)) { // Handle signed option ++signed_num; diags.setDiagnosticGroupMapping("signed-overflow", diag::MAP_IGNORE); } else break; // we're done with the list } }