[PATCH] D43547: [NameMangling] Make ASTContext owning the ManglingContext during entire compilation
Michael Haidl via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 21 01:12:37 PST 2018
pacxx created this revision.
pacxx added reviewers: rnk, rsmith.
Herald added a subscriber: cfe-commits.
The ASTContext is only used to create a Mangling Context and forwards ownership to everyone who requests a ManglingContext.
The problem fixed by this commit is located in the handling of the __FUNCDNAME__ generation. Every time a __FUNCDNAME__ expression is handled a new ManglingContext is created. The MC and its cached manglings are thrown away every time the __FUNCDNAME__ was handled which results in wrong numbering of lambda expressions in name manglings (every lambda gets id 0) what again leads to inconsistencies between __FUNCDNAME__ and the name manglings in the generated code.
Repository:
rC Clang
https://reviews.llvm.org/D43547
Files:
include/clang/AST/ASTContext.h
lib/AST/ASTContext.cpp
lib/Index/CodegenNameGenerator.cpp
Index: lib/Index/CodegenNameGenerator.cpp
===================================================================
--- lib/Index/CodegenNameGenerator.cpp
+++ lib/Index/CodegenNameGenerator.cpp
@@ -26,11 +26,11 @@
using namespace clang::index;
struct CodegenNameGenerator::Implementation {
- std::unique_ptr<MangleContext> MC;
+ MangleContext& MC;
llvm::DataLayout DL;
Implementation(ASTContext &Ctx)
- : MC(Ctx.createMangleContext()),
+ : MC(Ctx.getMangleContext()),
DL(Ctx.getTargetInfo().getDataLayout()) {}
bool writeName(const Decl *D, raw_ostream &OS) {
@@ -106,7 +106,6 @@
const NamedDecl *ND = cast<NamedDecl>(D);
ASTContext &Ctx = ND->getASTContext();
- std::unique_ptr<MangleContext> M(Ctx.createMangleContext());
std::vector<std::string> Manglings;
Index: lib/AST/ASTContext.cpp
===================================================================
--- lib/AST/ASTContext.cpp
+++ lib/AST/ASTContext.cpp
@@ -9570,6 +9570,12 @@
llvm_unreachable("Unsupported ABI");
}
+MangleContext &ASTContext::getMangleContext() {
+ if (!MContext)
+ MContext.reset(createMangleContext());
+ return *MContext.get();
+}
+
CXXABI::~CXXABI() = default;
size_t ASTContext::getSideTableAllocatedMemory() const {
Index: include/clang/AST/ASTContext.h
===================================================================
--- include/clang/AST/ASTContext.h
+++ include/clang/AST/ASTContext.h
@@ -2158,6 +2158,7 @@
VTableContextBase *getVTableContext();
MangleContext *createMangleContext();
+ MangleContext &getMangleContext();
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass,
SmallVectorImpl<const ObjCIvarDecl*> &Ivars) const;
@@ -2828,6 +2829,7 @@
std::unique_ptr<ParentMapOtherNodes> OtherParents;
std::unique_ptr<VTableContextBase> VTContext;
+ std::unique_ptr<MangleContext> MContext;
void ReleaseDeclContextMaps();
void ReleaseParentMapEntries();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43547.135201.patch
Type: text/x-patch
Size: 1983 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180221/e49bf6bd/attachment.bin>
More information about the cfe-commits
mailing list