r204423 - Serialize and deserialize mangling numbers.
Richard Smith
richard-llvm at metafoo.co.uk
Thu Mar 20 18:48:23 PDT 2014
Author: rsmith
Date: Thu Mar 20 20:48:23 2014
New Revision: 204423
URL: http://llvm.org/viewvc/llvm-project?rev=204423&view=rev
Log:
Serialize and deserialize mangling numbers.
Added:
cfe/trunk/test/PCH/cxx-mangling.cpp
Modified:
cfe/trunk/include/clang/Serialization/ASTWriter.h
cfe/trunk/lib/Serialization/ASTCommon.h
cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
cfe/trunk/lib/Serialization/ASTWriter.cpp
Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=204423&r1=204422&r2=204423&view=diff
==============================================================================
--- cfe/trunk/include/clang/Serialization/ASTWriter.h (original)
+++ cfe/trunk/include/clang/Serialization/ASTWriter.h Thu Mar 20 20:48:23 2014
@@ -291,6 +291,7 @@ private:
const Decl *Dcl;
void *Type;
unsigned Loc;
+ unsigned Val;
};
public:
@@ -300,6 +301,8 @@ private:
: Kind(Kind), Type(Type.getAsOpaquePtr()) {}
DeclUpdate(unsigned Kind, SourceLocation Loc)
: Kind(Kind), Loc(Loc.getRawEncoding()) {}
+ DeclUpdate(unsigned Kind, unsigned Val)
+ : Kind(Kind), Val(Val) {}
unsigned getKind() const { return Kind; }
const Decl *getDecl() const { return Dcl; }
@@ -307,6 +310,7 @@ private:
SourceLocation getLoc() const {
return SourceLocation::getFromRawEncoding(Loc);
}
+ unsigned getNumber() const { return Val; }
};
typedef SmallVector<DeclUpdate, 1> UpdateRecord;
Modified: cfe/trunk/lib/Serialization/ASTCommon.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTCommon.h?rev=204423&r1=204422&r2=204423&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTCommon.h (original)
+++ cfe/trunk/lib/Serialization/ASTCommon.h Thu Mar 20 20:48:23 2014
@@ -28,7 +28,9 @@ enum DeclUpdateKind {
UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER,
UPD_CXX_RESOLVED_EXCEPTION_SPEC,
UPD_CXX_DEDUCED_RETURN_TYPE,
- UPD_DECL_MARKED_USED
+ UPD_DECL_MARKED_USED,
+ UPD_MANGLING_NUMBER,
+ UPD_STATIC_LOCAL_NUMBER
};
TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT);
Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=204423&r1=204422&r2=204423&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Thu Mar 20 20:48:23 2014
@@ -2968,6 +2968,14 @@ void ASTDeclReader::UpdateDecl(Decl *D,
D->Used = true;
break;
}
+
+ case UPD_MANGLING_NUMBER:
+ Reader.Context.setManglingNumber(cast<NamedDecl>(D), Record[Idx++]);
+ break;
+
+ case UPD_STATIC_LOCAL_NUMBER:
+ Reader.Context.setStaticLocalNumber(cast<VarDecl>(D), Record[Idx++]);
+ break;
}
}
}
Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=204423&r1=204422&r2=204423&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Thu Mar 20 20:48:23 2014
@@ -4085,6 +4085,17 @@ void ASTWriter::WriteASTCore(Sema &SemaR
Record.push_back({UPD_CXX_ADDED_ANONYMOUS_NAMESPACE, NS});
}
+ // Add update records for all mangling numbers and static local numbers.
+ // These aren't really update records, but this is a convenient way of
+ // tagging this rare extra data onto the declarations.
+ for (const auto &Number : Context.MangleNumbers)
+ if (!Number.first->isFromASTFile())
+ DeclUpdates[Number.first].push_back({UPD_MANGLING_NUMBER, Number.second});
+ for (const auto &Number : Context.StaticLocalNumbers)
+ if (!Number.first->isFromASTFile())
+ DeclUpdates[Number.first].push_back({UPD_STATIC_LOCAL_NUMBER,
+ Number.second});
+
// Make sure visible decls, added to DeclContexts previously loaded from
// an AST file, are registered for serialization.
for (SmallVectorImpl<const Decl *>::iterator
@@ -4187,13 +4198,12 @@ void ASTWriter::WriteASTCore(Sema &SemaR
} while (!DeclUpdates.empty());
Stream.ExitBlock();
- if (!DeclUpdatesOffsetsRecord.empty())
- Stream.EmitRecord(DECL_UPDATE_OFFSETS, DeclUpdatesOffsetsRecord);
-
DoneWritingDeclsAndTypes = true;
// These things can only be done once we've written out decls and types.
WriteTypeDeclOffsets();
+ if (!DeclUpdatesOffsetsRecord.empty())
+ Stream.EmitRecord(DECL_UPDATE_OFFSETS, DeclUpdatesOffsetsRecord);
WriteCXXBaseSpecifiersOffsets();
WriteFileDeclIDsMap();
WriteSourceManagerBlock(Context.getSourceManager(), PP, isysroot);
@@ -4372,6 +4382,11 @@ void ASTWriter::WriteDeclUpdatesBlocks(R
case UPD_DECL_MARKED_USED:
break;
+
+ case UPD_MANGLING_NUMBER:
+ case UPD_STATIC_LOCAL_NUMBER:
+ Record.push_back(Update.getNumber());
+ break;
}
}
Added: cfe/trunk/test/PCH/cxx-mangling.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/cxx-mangling.cpp?rev=204423&view=auto
==============================================================================
--- cfe/trunk/test/PCH/cxx-mangling.cpp (added)
+++ cfe/trunk/test/PCH/cxx-mangling.cpp Thu Mar 20 20:48:23 2014
@@ -0,0 +1,28 @@
+// Test without PCH.
+// RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -include %s %s -emit-llvm -o - | FileCheck %s
+//
+// Test with PCH.
+// RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -x c++-header %s -emit-pch -o %t
+// RUN: %clang_cc1 -std=c++11 -triple %itanium_abi_triple -fcxx-exceptions -fexceptions -include-pch %t %s -emit-llvm -o - | FileCheck %s
+
+#ifndef HEADER
+#define HEADER
+
+struct A {
+ struct { int a; } a;
+ struct { int b; } b;
+};
+
+#else
+
+template<typename T> void f(T) {}
+
+// CHECK-LABEL: define void @_Z1g1A(
+void g(A a) {
+ // CHECK: call void @_Z1fIN1AUt0_EEvT_(
+ f(a.b);
+ // CHECK: call void @_Z1fIN1AUt_EEvT_(
+ f(a.a);
+}
+
+#endif
More information about the cfe-commits
mailing list