LCOV - code coverage report
Current view: top level - lib/Support - SymbolRemappingReader.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 20 20 100.0 %
Date: 2018-10-20 13:21:21 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- SymbolRemappingReader.cpp - Read symbol remapping file -------------===//
       2             : //
       3             : //                      The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This file contains definitions needed for reading and applying symbol
      11             : // remapping files.
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #include "llvm/Support/SymbolRemappingReader.h"
      16             : #include "llvm/ADT/StringSwitch.h"
      17             : #include "llvm/ADT/Twine.h"
      18             : #include "llvm/Support/LineIterator.h"
      19             : 
      20             : using namespace llvm;
      21             : 
      22             : char SymbolRemappingParseError::ID;
      23             : 
      24             : /// Load a set of name remappings from a text file.
      25             : ///
      26             : /// See the documentation at the top of the file for an explanation of
      27             : /// the expected format.
      28          19 : Error SymbolRemappingReader::read(MemoryBuffer &B) {
      29          19 :   line_iterator LineIt(B, /*SkipBlanks=*/true, '#');
      30             : 
      31             :   auto ReportError = [&](Twine Msg) {
      32             :     return llvm::make_error<SymbolRemappingParseError>(
      33             :         B.getBufferIdentifier(), LineIt.line_number(), Msg);
      34             :   };
      35             : 
      36          64 :   for (; !LineIt.is_at_eof(); ++LineIt) {
      37          52 :     StringRef Line = *LineIt;
      38          52 :     Line = Line.ltrim(' ');
      39             :     // line_iterator only detects comments starting in column 1.
      40          43 :     if (Line.startswith("#") || Line.empty())
      41          14 :       continue;
      42             : 
      43             :     SmallVector<StringRef, 4> Parts;
      44          38 :     Line.split(Parts, ' ', /*MaxSplits*/-1, /*KeepEmpty*/false);
      45             : 
      46          38 :     if (Parts.size() != 3)
      47             :       return ReportError("Expected 'kind mangled_name mangled_name', "
      48           1 :                          "found '" + Line + "'");
      49             : 
      50             :     using FK = ItaniumManglingCanonicalizer::FragmentKind;
      51          37 :     Optional<FK> FragmentKind = StringSwitch<Optional<FK>>(Parts[0])
      52             :                                     .Case("name", FK::Name)
      53             :                                     .Case("type", FK::Type)
      54             :                                     .Case("encoding", FK::Encoding)
      55             :                                     .Default(None);
      56          37 :     if (!FragmentKind)
      57             :       return ReportError("Invalid kind, expected 'name', 'type', or 'encoding',"
      58           1 :                          " found '" + Parts[0] + "'");
      59             : 
      60             :     using EE = ItaniumManglingCanonicalizer::EquivalenceError;
      61          72 :     switch (Canonicalizer.addEquivalence(*FragmentKind, Parts[1], Parts[2])) {
      62             :     case EE::Success:
      63             :       break;
      64             : 
      65             :     case EE::ManglingAlreadyUsed:
      66           1 :       return ReportError("Manglings '" + Parts[1] + "' and '" + Parts[2] + "' "
      67             :                          "have both been used in prior remappings. Move this "
      68           1 :                          "remapping earlier in the file.");
      69             : 
      70             :     case EE::InvalidFirstMangling:
      71           1 :       return ReportError("Could not demangle '" + Parts[1] + "' "
      72           1 :                          "as a <" + Parts[0] + ">; invalid mangling?");
      73             : 
      74             :     case EE::InvalidSecondMangling:
      75           3 :       return ReportError("Could not demangle '" + Parts[2] + "' "
      76           3 :                          "as a <" + Parts[0] + ">; invalid mangling?");
      77             :     }
      78             :   }
      79             : 
      80             :   return Error::success();
      81             : }

Generated by: LCOV version 1.13