[MC] Fix an assert in MCAssembler::writeSectionData to be aware of errors
authorFangrui Song <i@maskray.me>
Fri, 30 Oct 2020 06:09:57 +0000 (23:09 -0700)
committerFangrui Song <i@maskray.me>
Fri, 30 Oct 2020 06:11:18 +0000 (23:11 -0700)
If MCContext has an error, MCAssembler::layout may stop early
and some MCFragment's may not finalize.

In the Linux kernel, arch/x86/lib/memcpy_64.S could trigger the assert before
"x86_64: Change .weak to SYM_FUNC_START_WEAK for arch/x86/lib/mem*_64.S"

llvm/lib/MC/MCAssembler.cpp

index 1b2eb24..1422014 100644 (file)
@@ -768,7 +768,8 @@ void MCAssembler::writeSectionData(raw_ostream &OS, const MCSection *Sec,
   for (const MCFragment &F : *Sec)
     writeFragment(OS, *this, Layout, F);
 
-  assert(OS.tell() - Start == Layout.getSectionAddressSize(Sec));
+  assert(getContext().hadError() ||
+         OS.tell() - Start == Layout.getSectionAddressSize(Sec));
 }
 
 std::tuple<MCValue, uint64_t, bool>