@@ -192,6 +192,28 @@ class MLIRGenImpl
192192 const_cast<llvm::SourceMgr &>(sourceMgr).setIncludeDirs(includeDirs);
193193 }
194194
195+ // RAII scope switching the current source file and file name (used for locations and debug info).
196+ class SourceFileScope
197+ {
198+ public:
199+ SourceFileScope(MLIRGenImpl &mlirGenImpl, ts::SourceFile newSourceFile, llvm::StringRef newFileName)
200+ : sourceFileGuard(mlirGenImpl.sourceFile, newSourceFile),
201+ fileNameGuard(mlirGenImpl.mainSourceFileName, newFileName)
202+ {
203+ }
204+
205+ // interns the file name from the source file's wide file name
206+ SourceFileScope(MLIRGenImpl &mlirGenImpl, ts::SourceFile newSourceFile)
207+ : SourceFileScope(mlirGenImpl, newSourceFile,
208+ llvm::StringRef(convertWideToUTF8(newSourceFile->fileName)).copy(mlirGenImpl.stringAllocator))
209+ {
210+ }
211+
212+ private:
213+ MLIRValueGuard<ts::SourceFile> sourceFileGuard;
214+ MLIRValueGuard<llvm::StringRef> fileNameGuard;
215+ };
216+
195217 mlir::LogicalResult report(SourceFile module, const std::vector<SourceFile> &includeFiles)
196218 {
197219 // output diag info
@@ -748,12 +770,7 @@ class MLIRGenImpl
748770
749771 for (auto includeFile : includeFiles)
750772 {
751- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
752- auto fileNameUtf8 = convertWideToUTF8(includeFile->fileName);
753- mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator);
754-
755- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
756- sourceFile = includeFile;
773+ SourceFileScope sourceFileScope(*this, includeFile);
757774
758775 if (failed(mlirGen(includeFile->statements, genContextPartial)))
759776 {
@@ -830,12 +847,7 @@ class MLIRGenImpl
830847
831848 for (auto includeFile : includeFiles)
832849 {
833- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
834- auto fileNameUtf8 = convertWideToUTF8(includeFile->fileName);
835- mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator);;
836-
837- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
838- sourceFile = includeFile;
850+ SourceFileScope sourceFileScope(*this, includeFile);
839851
840852 if (failed(mlirGen(includeFile->statements, genContext)))
841853 {
@@ -983,12 +995,7 @@ class MLIRGenImpl
983995 }
984996
985997 // we need to override filename to track it in DBG info
986- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
987- auto fileNameUtf8 = convertWideToUTF8(importSource->fileName);
988- mainSourceFileName = StringRef(fileNameUtf8).copy(stringAllocator);
989-
990- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
991- sourceFile = importSource;
998+ SourceFileScope sourceFileScope(*this, importSource);
992999
9931000 if (mlir::succeeded(mlirDiscoverAllDependencies(importSource, importIncludeFiles)) &&
9941001 mlir::succeeded(mlirCodeGenModule(importSource, importIncludeFiles, false, false)))
@@ -2219,11 +2226,7 @@ class MLIRGenImpl
22192226 MLIRNamespaceGuard nsGuard(currentNamespace);
22202227 currentNamespace = functionGenericTypeInfo->elementNamespace;
22212228
2222- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2223- sourceFile = functionGenericTypeInfo->sourceFile;
2224-
2225- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2226- mainSourceFileName = functionGenericTypeInfo->fileName;
2229+ SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName);
22272230
22282231 return instantiateSpecializedFunctionTypeHelper(location, functionGenericTypeInfo->functionDeclaration,
22292232 recieverType, discoverReturnType, genContext);
@@ -2315,11 +2318,7 @@ class MLIRGenImpl
23152318 MLIRNamespaceGuard nsGuard(currentNamespace);
23162319 currentNamespace = functionGenericTypeInfo->elementNamespace;
23172320
2318- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2319- sourceFile = functionGenericTypeInfo->sourceFile;
2320-
2321- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2322- mainSourceFileName = functionGenericTypeInfo->fileName;
2321+ SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName);
23232322
23242323 auto [result, specFuncOp, specFuncName, isGeneric] =
23252324 mlirGenFunctionLikeDeclaration(functionGenericTypeInfo->functionDeclaration, funcGenContext);
@@ -2669,11 +2668,7 @@ class MLIRGenImpl
26692668 MLIRNamespaceGuard ng(currentNamespace);
26702669 currentNamespace = functionGenericTypeInfo->elementNamespace;
26712670
2672- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2673- sourceFile = functionGenericTypeInfo->sourceFile;
2674-
2675- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2676- mainSourceFileName = functionGenericTypeInfo->fileName;
2671+ SourceFileScope sourceFileScope(*this, functionGenericTypeInfo->sourceFile, functionGenericTypeInfo->fileName);
26772672
26782673 auto anyNamedGenericType = IsGeneric::False;
26792674
@@ -2900,11 +2895,7 @@ class MLIRGenImpl
29002895 MLIRNamespaceGuard ng(currentNamespace);
29012896 currentNamespace = genericClassInfo->elementNamespace;
29022897
2903- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2904- sourceFile = genericClassInfo->sourceFile;
2905-
2906- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2907- mainSourceFileName = genericClassInfo->fileName;
2898+ SourceFileScope sourceFileScope(*this, genericClassInfo->sourceFile, genericClassInfo->fileName);
29082899
29092900 GenContext genericTypeGenContext(genContext);
29102901 genericTypeGenContext.instantiateSpecializedFunction = false;
@@ -2970,11 +2961,7 @@ class MLIRGenImpl
29702961 MLIRNamespaceGuard ng(currentNamespace);
29712962 currentNamespace = genericClassInfo->elementNamespace;
29722963
2973- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
2974- sourceFile = genericClassInfo->sourceFile;
2975-
2976- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
2977- mainSourceFileName = genericClassInfo->fileName;
2964+ SourceFileScope sourceFileScope(*this, genericClassInfo->sourceFile, genericClassInfo->fileName);
29782965
29792966 GenContext genericTypeGenContext(genContext);
29802967 genericTypeGenContext.instantiateSpecializedFunction = false;
@@ -3044,11 +3031,7 @@ class MLIRGenImpl
30443031 MLIRNamespaceGuard ng(currentNamespace);
30453032 currentNamespace = genericInterfaceInfo->elementNamespace;
30463033
3047- MLIRValueGuard<ts::SourceFile> vgSourceFile(sourceFile);
3048- sourceFile = genericInterfaceInfo->sourceFile;
3049-
3050- MLIRValueGuard<llvm::StringRef> vgFileName(mainSourceFileName);
3051- mainSourceFileName = genericInterfaceInfo->fileName;
3034+ SourceFileScope sourceFileScope(*this, genericInterfaceInfo->sourceFile, genericInterfaceInfo->fileName);
30523035
30533036 GenContext genericTypeGenContext(genContext);
30543037 auto typeParams = genericInterfaceInfo->typeParams;
0 commit comments