forked from OSchip/llvm-project
IRGen: Factor out function CodeGenAction::loadModule. NFCI.
llvm-svn: 292972
This commit is contained in:
parent
390dfde0f3
commit
65cb42c1ce
|
@ -31,6 +31,8 @@ private:
|
|||
llvm::LLVMContext *VMContext;
|
||||
bool OwnsVMContext;
|
||||
|
||||
std::unique_ptr<llvm::Module> loadModule(llvm::MemoryBufferRef MBRef);
|
||||
|
||||
protected:
|
||||
/// Create a new code generation action. If the optional \p _VMContext
|
||||
/// parameter is supplied, the action uses it without taking ownership,
|
||||
|
|
|
@ -838,6 +838,41 @@ static void BitcodeInlineAsmDiagHandler(const llvm::SMDiagnostic &SM,
|
|||
Diags->Report(DiagID).AddString("cannot compile inline asm");
|
||||
}
|
||||
|
||||
std::unique_ptr<llvm::Module> CodeGenAction::loadModule(MemoryBufferRef MBRef) {
|
||||
CompilerInstance &CI = getCompilerInstance();
|
||||
SourceManager &SM = CI.getSourceManager();
|
||||
|
||||
// For ThinLTO backend invocations, ensure that the context
|
||||
// merges types based on ODR identifiers.
|
||||
if (!CI.getCodeGenOpts().ThinLTOIndexFile.empty())
|
||||
VMContext->enableDebugTypeODRUniquing();
|
||||
|
||||
llvm::SMDiagnostic Err;
|
||||
if (std::unique_ptr<llvm::Module> M = parseIR(MBRef, Err, *VMContext))
|
||||
return M;
|
||||
|
||||
// Translate from the diagnostic info to the SourceManager location if
|
||||
// available.
|
||||
// TODO: Unify this with ConvertBackendLocation()
|
||||
SourceLocation Loc;
|
||||
if (Err.getLineNo() > 0) {
|
||||
assert(Err.getColumnNo() >= 0);
|
||||
Loc = SM.translateFileLineCol(SM.getFileEntryForID(SM.getMainFileID()),
|
||||
Err.getLineNo(), Err.getColumnNo() + 1);
|
||||
}
|
||||
|
||||
// Strip off a leading diagnostic code if there is one.
|
||||
StringRef Msg = Err.getMessage();
|
||||
if (Msg.startswith("error: "))
|
||||
Msg = Msg.substr(7);
|
||||
|
||||
unsigned DiagID =
|
||||
CI.getDiagnostics().getCustomDiagID(DiagnosticsEngine::Error, "%0");
|
||||
|
||||
CI.getDiagnostics().Report(Loc, DiagID) << Msg;
|
||||
return {};
|
||||
}
|
||||
|
||||
void CodeGenAction::ExecuteAction() {
|
||||
// If this is an IR file, we have to treat it specially.
|
||||
if (getCurrentFileKind() == IK_LLVM_IR) {
|
||||
|
@ -855,35 +890,10 @@ void CodeGenAction::ExecuteAction() {
|
|||
if (Invalid)
|
||||
return;
|
||||
|
||||
// For ThinLTO backend invocations, ensure that the context
|
||||
// merges types based on ODR identifiers.
|
||||
if (!CI.getCodeGenOpts().ThinLTOIndexFile.empty())
|
||||
VMContext->enableDebugTypeODRUniquing();
|
||||
|
||||
llvm::SMDiagnostic Err;
|
||||
TheModule = parseIR(MainFile->getMemBufferRef(), Err, *VMContext);
|
||||
if (!TheModule) {
|
||||
// Translate from the diagnostic info to the SourceManager location if
|
||||
// available.
|
||||
// TODO: Unify this with ConvertBackendLocation()
|
||||
SourceLocation Loc;
|
||||
if (Err.getLineNo() > 0) {
|
||||
assert(Err.getColumnNo() >= 0);
|
||||
Loc = SM.translateFileLineCol(SM.getFileEntryForID(FID),
|
||||
Err.getLineNo(), Err.getColumnNo() + 1);
|
||||
}
|
||||
|
||||
// Strip off a leading diagnostic code if there is one.
|
||||
StringRef Msg = Err.getMessage();
|
||||
if (Msg.startswith("error: "))
|
||||
Msg = Msg.substr(7);
|
||||
|
||||
unsigned DiagID =
|
||||
CI.getDiagnostics().getCustomDiagID(DiagnosticsEngine::Error, "%0");
|
||||
|
||||
CI.getDiagnostics().Report(Loc, DiagID) << Msg;
|
||||
TheModule = loadModule(*MainFile);
|
||||
if (!TheModule)
|
||||
return;
|
||||
}
|
||||
|
||||
const TargetOptions &TargetOpts = CI.getTargetOpts();
|
||||
if (TheModule->getTargetTriple() != TargetOpts.Triple) {
|
||||
CI.getDiagnostics().Report(SourceLocation(),
|
||||
|
|
Loading…
Reference in New Issue