to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
100 lines
3.6 KiB
C++
100 lines
3.6 KiB
C++
//===-- ClangExternalASTSourceCallbacks.cpp ---------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
|
|
|
|
|
|
// Clang headers like to use NDEBUG inside of them to enable/disable debug
|
|
// related 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/DeclBase.h"
|
|
#include "clang/AST/DeclarationName.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
|
|
|
|
#include "lldb/Utility/Log.h"
|
|
#include "clang/AST/Decl.h"
|
|
|
|
using namespace clang;
|
|
using namespace lldb_private;
|
|
|
|
bool ClangExternalASTSourceCallbacks::FindExternalVisibleDeclsByName(
|
|
const clang::DeclContext *decl_ctx,
|
|
clang::DeclarationName clang_decl_name) {
|
|
if (m_callback_find_by_name) {
|
|
llvm::SmallVector<clang::NamedDecl *, 3> results;
|
|
|
|
m_callback_find_by_name(m_callback_baton, decl_ctx, clang_decl_name,
|
|
&results);
|
|
|
|
SetExternalVisibleDeclsForName(decl_ctx, clang_decl_name, results);
|
|
|
|
return (results.size() != 0);
|
|
}
|
|
|
|
std::string decl_name(clang_decl_name.getAsString());
|
|
SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name);
|
|
return false;
|
|
}
|
|
|
|
void ClangExternalASTSourceCallbacks::CompleteType(TagDecl *tag_decl) {
|
|
if (m_callback_tag_decl)
|
|
m_callback_tag_decl(m_callback_baton, tag_decl);
|
|
}
|
|
|
|
void ClangExternalASTSourceCallbacks::CompleteType(
|
|
ObjCInterfaceDecl *objc_decl) {
|
|
if (m_callback_objc_decl)
|
|
m_callback_objc_decl(m_callback_baton, objc_decl);
|
|
}
|
|
|
|
bool ClangExternalASTSourceCallbacks::layoutRecordType(
|
|
const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment,
|
|
llvm::DenseMap<const clang::FieldDecl *, uint64_t> &FieldOffsets,
|
|
llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &BaseOffsets,
|
|
llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits>
|
|
&VirtualBaseOffsets) {
|
|
if (m_callback_layout_record_type)
|
|
return m_callback_layout_record_type(m_callback_baton, Record, Size,
|
|
Alignment, FieldOffsets, BaseOffsets,
|
|
VirtualBaseOffsets);
|
|
|
|
return false;
|
|
}
|
|
|
|
void ClangExternalASTSourceCallbacks::FindExternalLexicalDecls(
|
|
const clang::DeclContext *decl_ctx,
|
|
llvm::function_ref<bool(clang::Decl::Kind)> IsKindWeWant,
|
|
llvm::SmallVectorImpl<clang::Decl *> &decls) {
|
|
if (m_callback_tag_decl && decl_ctx) {
|
|
clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(
|
|
const_cast<clang::DeclContext *>(decl_ctx));
|
|
if (tag_decl)
|
|
CompleteType(tag_decl);
|
|
}
|
|
}
|