blob: 0efe1a6900db226630c9f461acc266ccaec9788b [file] [log] [blame]
//===-- ClangExternalASTSourceCommon.h --------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_ClangExternalASTSourceCommon_h
#define liblldb_ClangExternalASTSourceCommon_h
// Clang headers like to use NDEBUG inside of them to enable/disable debug
// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
// or another. This is bad because it means that if clang was built in release
// mode, it assumes that you are building in release mode which is not always
// the case. You can end up with functions that are defined as empty in header
// files when NDEBUG is not defined, and this can cause link errors with the
// clang .a files that you have since you might be missing functions in the .a
// file. So we have to define NDEBUG when including clang headers to avoid any
// mismatches. This is covered by rdar://problem/8691220
#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
#define LLDB_DEFINED_NDEBUG_FOR_CLANG
#define NDEBUG
// Need to include assert.h so it is as clang would expect it to be (disabled)
#include <assert.h>
#endif
#include "clang/AST/ExternalASTSource.h"
#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
#undef NDEBUG
#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
#include <assert.h>
#endif
namespace lldb_private {
class ClangExternalASTSourceCommon : public clang::ExternalASTSource
{
public:
ClangExternalASTSourceCommon();
~ClangExternalASTSourceCommon();
virtual uint64_t GetMetadata(uintptr_t object);
virtual void SetMetadata(uintptr_t object, uint64_t metadata);
virtual bool HasMetadata(uintptr_t object);
private:
typedef llvm::DenseMap<uintptr_t, uint64_t> MetadataMap;
MetadataMap m_metadata;
uint64_t m_magic; ///< Because we don't have RTTI, we must take it
///< on faith that any valid ExternalASTSource that
///< we try to use the *Metadata APIs on inherits
///< from ClangExternalASTSourceCommon. This magic
///< number exists to enforce that.
};
}
#endif