|
@@ -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(),
|