
relative paths, like: /whatever/llvm/lib/Sema/../../include/llvm/Sema/ That causes problems with our type uniquing, since we use the declaration file and line as one component of the uniquing, and different ways of getting to the same file will have different directory spellings, though they are functionally equivalent. We end up with two copies of the exact same type because of this, and that makes the expression parser give "duplicate type" errors. I added a method to resolve paths with ../ in them and used that in the FileSpec::Equals, for comparing Declarations and for doing Breakpoint compares as well, since they also suffer from this if you specify breakpoints by full path (since nobody knows what ../'s to insert...) <rdar://problem/18765814> llvm-svn: 222075
118 lines
2.7 KiB
C++
118 lines
2.7 KiB
C++
//===-- Declaration.cpp -----------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Symbol/Declaration.h"
|
|
#include "lldb/Core/Stream.h"
|
|
|
|
using namespace lldb_private;
|
|
|
|
void
|
|
Declaration::Dump(Stream *s, bool show_fullpaths) const
|
|
{
|
|
if (m_file)
|
|
{
|
|
*s << ", decl = ";
|
|
if (show_fullpaths)
|
|
*s << m_file;
|
|
else
|
|
*s << m_file.GetFilename();
|
|
if (m_line > 0)
|
|
s->Printf(":%u", m_line);
|
|
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
|
|
if (m_column > 0)
|
|
s->Printf(":%u", m_column);
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
if (m_line > 0)
|
|
{
|
|
s->Printf(", line = %u", m_line);
|
|
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
|
|
if (m_column > 0)
|
|
s->Printf(":%u", m_column);
|
|
#endif
|
|
}
|
|
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
|
|
else if (m_column > 0)
|
|
s->Printf(", column = %u", m_column);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
bool
|
|
Declaration::DumpStopContext (Stream *s, bool show_fullpaths) const
|
|
{
|
|
if (m_file)
|
|
{
|
|
if (show_fullpaths || s->GetVerbose())
|
|
*s << m_file;
|
|
else
|
|
m_file.GetFilename().Dump(s);
|
|
|
|
if (m_line > 0)
|
|
s->Printf(":%u", m_line);
|
|
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
|
|
if (m_column > 0)
|
|
s->Printf(":%u", m_column);
|
|
#endif
|
|
return true;
|
|
}
|
|
else if (m_line > 0)
|
|
{
|
|
s->Printf(" line %u", m_line);
|
|
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
|
|
if (m_column > 0)
|
|
s->Printf(":%u", m_column);
|
|
#endif
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
size_t
|
|
Declaration::MemorySize() const
|
|
{
|
|
return sizeof(Declaration);
|
|
}
|
|
|
|
int
|
|
Declaration::Compare(const Declaration& a, const Declaration& b)
|
|
{
|
|
int result = FileSpec::Compare(a.m_file, b.m_file, true);
|
|
if (result)
|
|
return result;
|
|
if (a.m_line < b.m_line)
|
|
return -1;
|
|
else if (a.m_line > b.m_line)
|
|
return 1;
|
|
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
|
|
if (a.m_column < b.m_column)
|
|
return -1;
|
|
else if (a.m_column > b.m_column)
|
|
return 1;
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
bool
|
|
lldb_private::operator == (const Declaration &lhs, const Declaration &rhs)
|
|
{
|
|
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
|
|
if (lhs.GetColumn () == rhs.GetColumn ())
|
|
if (lhs.GetLine () == rhs.GetLine ())
|
|
return lhs.GetFile() == rhs.GetFile();
|
|
#else
|
|
if (lhs.GetLine () == rhs.GetLine ())
|
|
return FileSpec::Equal(lhs.GetFile(),rhs.GetFile(), true, true);
|
|
#endif
|
|
return false;
|
|
}
|
|
|