Reporting source errors from MCCodeEmitter::encodeInstruction() ?

[apologies for this duplicate post: originally sent to lldb-dev by not
paying attention to the address auto-completion]

We have a backend for a target that at present only detects some
assembler errors when emitting instructions (basically because the
platform has configurable properties with dependencies between
instructions and it was easier to check for their interaction late
than try to detect them earlier, e.g. through custom encoder methods
and tablegen). Emitting diagnostics through
SourceManager::PrintMessage() "works" in the limited sense of
communicating the problem to a human, however it doesn't prevent
generation of an incorrect output file or change the process exit
code.

We'd prefer not to resort to report_fatal_error() since that isn't a
polite way to diagnose problems in the source.

Is there a sensible way to properly signal a source error from the
level of encodeInstruction()? Or is it expected that all such errors
are reported earlier?

I was going to say use MCContext::reportError, but that mainly calls SourceManager::PrintMessage. Does that not prevent clang from emitting a .o file? That seems like a bug if so.

Well, MCContext::reportError does track errors, so llvm-mc could check for errors at the end.

Having re-read your first mail with better attention, you're quite
correct: MCContext::reportError() does give a good error pathway from
llvm-mc (no .o emitted, exit code == 1), and that's the answer to my
problem, i.e. something like:

if(warning) {
  auto SM(CTX.getSourceManager());
  if(SM) {
    SM->PrintMessage(MI.getLoc(), SourceMgr::DK_Warning, msg);
    return;
  }
  // without SrcMgr least-worst approach is promoting warning to error
}
CTX.reportError(MI.getLoc(), msg);

Having a similar MCContext::reportWarning() API to conceal the SrcMgr
plumbing would be nice.

Thanks again for your help!