Skip to content

Commit 222f137

Browse files
author
git apple-llvm automerger
committed
Merge commit '8056d92bc201' from llvm.org/main into next
2 parents abe5c1a + 8056d92 commit 222f137

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

lldb/source/Plugins/ExpressionParser/Clang/ASTUtils.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "clang/Sema/Sema.h"
1717
#include "clang/Sema/SemaConsumer.h"
1818
#include "llvm/ADT/IntrusiveRefCntPtr.h"
19+
#include "llvm/Support/Casting.h"
1920
#include <optional>
2021

2122
namespace clang {
@@ -139,6 +140,24 @@ class ExternalASTSourceWrapper : public ImporterBackedASTSource {
139140
return m_Source->layoutRecordType(Record, Size, Alignment, FieldOffsets,
140141
BaseOffsets, VirtualBaseOffsets);
141142
}
143+
144+
/// This gets called when Sema is reconciling undefined but used decls.
145+
/// For LLDB's use-case, we never provide Clang with function definitions,
146+
/// instead we rely on linkage names and symbol resolution to call the
147+
/// correct funcitons during JITting. So this implementation clears
148+
/// any "undefined" FunctionDecls that Clang found while parsing.
149+
///
150+
/// \param[in,out] Undefined A set of used decls for which Clang has not
151+
/// been provided a definition with.
152+
///
153+
void ReadUndefinedButUsed(
154+
llvm::MapVector<clang::NamedDecl *, clang::SourceLocation> &Undefined)
155+
override {
156+
Undefined.remove_if([](auto const &decl_loc_pair) {
157+
const clang::NamedDecl *ND = decl_loc_pair.first;
158+
return llvm::isa_and_present<clang::FunctionDecl>(ND);
159+
});
160+
}
142161
};
143162

144163
/// Wraps an ASTConsumer into an SemaConsumer. Doesn't take ownership of the

lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,6 +1223,8 @@ ClangExpressionParser::ParseInternal(DiagnosticManager &diagnostic_manager,
12231223

12241224
clang::ExternalASTSource *ast_source = decl_map->CreateProxy();
12251225

1226+
auto *ast_source_wrapper = new ExternalASTSourceWrapper(ast_source);
1227+
12261228
if (ast_context.getExternalSource()) {
12271229
auto *module_wrapper =
12281230
new ExternalASTSourceWrapper(ast_context.getExternalSource());
@@ -1236,6 +1238,7 @@ ClangExpressionParser::ParseInternal(DiagnosticManager &diagnostic_manager,
12361238
} else {
12371239
ast_context.setExternalSource(ast_source);
12381240
}
1241+
m_compiler->getSema().addExternalSource(ast_source_wrapper);
12391242
decl_map->InstallASTContext(*m_ast_context);
12401243
}
12411244

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Tests that we can evaluate functions that Clang
2+
// classifies as having clang::Linkage::UniqueExternal
3+
// linkage. In this case, a function whose argument
4+
// is not legally usable outside this TU.
5+
6+
// RUN: %build %s -o %t
7+
// RUN: %lldb %t -o run -o "expression func(a)" -o exit | FileCheck %s
8+
9+
// CHECK: expression func(a)
10+
// CHECK: (int) $0 = 15
11+
12+
namespace {
13+
struct InAnon {};
14+
} // namespace
15+
16+
int func(InAnon a) { return 15; }
17+
18+
int main() {
19+
InAnon a;
20+
__builtin_debugtrap();
21+
return func(a);
22+
}

0 commit comments

Comments
 (0)