LCOV - code coverage report
Current view: top level - lib/DebugInfo/PDB - PDBSymbolTypeFunctionSig.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 13 29 44.8 %
Date: 2018-10-20 13:21:21 Functions: 4 8 50.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- PDBSymbolTypeFunctionSig.cpp - --------------------------*- C++ -*-===//
       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             : #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
      11             : 
      12             : #include "llvm/DebugInfo/PDB/ConcreteSymbolEnumerator.h"
      13             : #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
      14             : #include "llvm/DebugInfo/PDB/IPDBSession.h"
      15             : #include "llvm/DebugInfo/PDB/PDBSymDumper.h"
      16             : #include "llvm/DebugInfo/PDB/PDBSymbol.h"
      17             : #include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
      18             : #include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
      19             : 
      20             : #include <utility>
      21             : 
      22             : using namespace llvm;
      23             : using namespace llvm::pdb;
      24             : 
      25             : namespace {
      26             : class FunctionArgEnumerator : public IPDBEnumSymbols {
      27             : public:
      28             :   typedef ConcreteSymbolEnumerator<PDBSymbolTypeFunctionArg> ArgEnumeratorType;
      29             : 
      30             :   FunctionArgEnumerator(const IPDBSession &PDBSession,
      31             :                         const PDBSymbolTypeFunctionSig &Sig)
      32          61 :       : Session(PDBSession),
      33          61 :         Enumerator(Sig.findAllChildren<PDBSymbolTypeFunctionArg>()) {}
      34             : 
      35             :   FunctionArgEnumerator(const IPDBSession &PDBSession,
      36             :                         std::unique_ptr<ArgEnumeratorType> ArgEnumerator)
      37             :       : Session(PDBSession), Enumerator(std::move(ArgEnumerator)) {}
      38             : 
      39          51 :   uint32_t getChildCount() const override {
      40          51 :     return Enumerator->getChildCount();
      41             :   }
      42             : 
      43           0 :   std::unique_ptr<PDBSymbol> getChildAtIndex(uint32_t Index) const override {
      44           0 :     auto FunctionArgSymbol = Enumerator->getChildAtIndex(Index);
      45           0 :     if (!FunctionArgSymbol)
      46             :       return nullptr;
      47           0 :     return Session.getSymbolById(FunctionArgSymbol->getTypeId());
      48             :   }
      49             : 
      50         112 :   std::unique_ptr<PDBSymbol> getNext() override {
      51         112 :     auto FunctionArgSymbol = Enumerator->getNext();
      52         112 :     if (!FunctionArgSymbol)
      53             :       return nullptr;
      54          51 :     return Session.getSymbolById(FunctionArgSymbol->getTypeId());
      55             :   }
      56             : 
      57           0 :   void reset() override { Enumerator->reset(); }
      58             : 
      59             : private:
      60             :   const IPDBSession &Session;
      61             :   std::unique_ptr<ArgEnumeratorType> Enumerator;
      62             : };
      63             : }
      64             : 
      65             : std::unique_ptr<IPDBEnumSymbols>
      66          61 : PDBSymbolTypeFunctionSig::getArguments() const {
      67          61 :   return llvm::make_unique<FunctionArgEnumerator>(Session, *this);
      68             : }
      69             : 
      70          58 : void PDBSymbolTypeFunctionSig::dump(PDBSymDumper &Dumper) const {
      71          58 :   Dumper.dump(*this);
      72          58 : }
      73             : 
      74           0 : void PDBSymbolTypeFunctionSig::dumpRight(PDBSymDumper &Dumper) const {
      75           0 :   Dumper.dumpRight(*this);
      76           0 : }
      77             : 
      78           0 : bool PDBSymbolTypeFunctionSig::isCVarArgs() const {
      79           0 :   auto SigArguments = getArguments();
      80           0 :   if (!SigArguments)
      81             :     return false;
      82           0 :   uint32_t NumArgs = SigArguments->getChildCount();
      83           0 :   if (NumArgs == 0)
      84             :     return false;
      85           0 :   auto Last = SigArguments->getChildAtIndex(NumArgs - 1);
      86             :   if (auto Builtin = llvm::dyn_cast_or_null<PDBSymbolTypeBuiltin>(Last.get())) {
      87           0 :     if (Builtin->getBuiltinType() == PDB_BuiltinType::None)
      88           0 :       return true;
      89             :   }
      90             : 
      91             :   // Note that for a variadic template signature, this method always returns
      92             :   // false since the parameters of the template are specialized.
      93             :   return false;
      94             : }

Generated by: LCOV version 1.13