|  | 
| 12 | 12 | #include "llvm/ADT/SmallString.h" | 
| 13 | 13 | #include "llvm/Support/Debug.h" | 
| 14 | 14 | #include "llvm/Support/Errc.h" | 
|  | 15 | +#include "llvm/Support/ErrorOr.h" | 
| 15 | 16 | #include "llvm/Support/FileSystem.h" | 
| 16 | 17 | #include "llvm/Support/MemoryBufferRef.h" | 
| 17 | 18 | #include "llvm/Support/Path.h" | 
| @@ -298,12 +299,11 @@ ConfigOptionsProvider::getRawOptions(llvm::StringRef FileName) { | 
| 298 | 299 |   if (ConfigOptions.InheritParentConfig.value_or(false)) { | 
| 299 | 300 |     LLVM_DEBUG(llvm::dbgs() | 
| 300 | 301 |                << "Getting options for file " << FileName << "...\n"); | 
| 301 |  | -    assert(FS && "FS must be set."); | 
| 302 | 302 | 
 | 
| 303 |  | -    llvm::SmallString<128> AbsoluteFilePath(FileName); | 
| 304 |  | - | 
| 305 |  | -    if (!FS->makeAbsolute(AbsoluteFilePath)) { | 
| 306 |  | -      addRawFileOptions(AbsoluteFilePath, RawOptions); | 
|  | 303 | +    llvm::ErrorOr<llvm::SmallString<128>> AbsoluteFilePath = | 
|  | 304 | +        getNormalizedAbsolutePath(FileName); | 
|  | 305 | +    if (AbsoluteFilePath) { | 
|  | 306 | +      addRawFileOptions(AbsoluteFilePath->str(), RawOptions); | 
| 307 | 307 |     } | 
| 308 | 308 |   } | 
| 309 | 309 |   RawOptions.emplace_back(ConfigOptions, | 
| @@ -334,6 +334,17 @@ FileOptionsBaseProvider::FileOptionsBaseProvider( | 
| 334 | 334 |       OverrideOptions(std::move(OverrideOptions)), | 
| 335 | 335 |       ConfigHandlers(std::move(ConfigHandlers)) {} | 
| 336 | 336 | 
 | 
|  | 337 | +llvm::ErrorOr<llvm::SmallString<128>> | 
|  | 338 | +FileOptionsBaseProvider::getNormalizedAbsolutePath(llvm::StringRef Path) { | 
|  | 339 | +  assert(FS && "FS must be set."); | 
|  | 340 | +  llvm::SmallString<128> NormalizedAbsolutePath = {Path}; | 
|  | 341 | +  std::error_code Err = FS->makeAbsolute(NormalizedAbsolutePath); | 
|  | 342 | +  if (Err) | 
|  | 343 | +    return Err; | 
|  | 344 | +  llvm::sys::path::remove_dots(NormalizedAbsolutePath, /*remove_dot_dot=*/true); | 
|  | 345 | +  return NormalizedAbsolutePath; | 
|  | 346 | +} | 
|  | 347 | + | 
| 337 | 348 | void FileOptionsBaseProvider::addRawFileOptions( | 
| 338 | 349 |     llvm::StringRef AbsolutePath, std::vector<OptionsSource> &CurOptions) { | 
| 339 | 350 |   auto CurSize = CurOptions.size(); | 
| @@ -397,16 +408,15 @@ std::vector<OptionsSource> | 
| 397 | 408 | FileOptionsProvider::getRawOptions(StringRef FileName) { | 
| 398 | 409 |   LLVM_DEBUG(llvm::dbgs() << "Getting options for file " << FileName | 
| 399 | 410 |                           << "...\n"); | 
| 400 |  | -  assert(FS && "FS must be set."); | 
| 401 |  | - | 
| 402 |  | -  llvm::SmallString<128> AbsoluteFilePath(FileName); | 
| 403 | 411 | 
 | 
| 404 |  | -  if (FS->makeAbsolute(AbsoluteFilePath)) | 
|  | 412 | +  llvm::ErrorOr<llvm::SmallString<128>> AbsoluteFilePath = | 
|  | 413 | +      getNormalizedAbsolutePath(FileName); | 
|  | 414 | +  if (!AbsoluteFilePath) | 
| 405 | 415 |     return {}; | 
| 406 | 416 | 
 | 
| 407 | 417 |   std::vector<OptionsSource> RawOptions = | 
| 408 |  | -      DefaultOptionsProvider::getRawOptions(AbsoluteFilePath.str()); | 
| 409 |  | -  addRawFileOptions(AbsoluteFilePath, RawOptions); | 
|  | 418 | +      DefaultOptionsProvider::getRawOptions(AbsoluteFilePath->str()); | 
|  | 419 | +  addRawFileOptions(AbsoluteFilePath->str(), RawOptions); | 
| 410 | 420 |   OptionsSource CommandLineOptions(OverrideOptions, | 
| 411 | 421 |                                    OptionsSourceTypeCheckCommandLineOption); | 
| 412 | 422 | 
 | 
|  | 
0 commit comments