summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/VTableBuilder.cpp
diff options
context:
space:
mode:
authorTimur Iskhodzhanov <timurrrr@google.com>2014-03-20 20:38:34 +0000
committerTimur Iskhodzhanov <timurrrr@google.com>2014-03-20 20:38:34 +0000
commitba5570221da15ae0954efabbd9f017c8c438ab44 (patch)
treeebd0a262cc255a642896bd44458a5e119e37c116 /clang/lib/AST/VTableBuilder.cpp
parent46357931ab7c07c1a43a64959284cab6e1697333 (diff)
downloadbcm5719-llvm-ba5570221da15ae0954efabbd9f017c8c438ab44.tar.gz
bcm5719-llvm-ba5570221da15ae0954efabbd9f017c8c438ab44.zip
Fix PR19172 - wrong this adjustment calculated for virtual destructor in a class with complex inheritance
Reviewed at http://llvm-reviews.chandlerc.com/D3128 llvm-svn: 204394
Diffstat (limited to 'clang/lib/AST/VTableBuilder.cpp')
-rw-r--r--clang/lib/AST/VTableBuilder.cpp22
1 files changed, 14 insertions, 8 deletions
diff --git a/clang/lib/AST/VTableBuilder.cpp b/clang/lib/AST/VTableBuilder.cpp
index 01372341177..12c5b8f6879 100644
--- a/clang/lib/AST/VTableBuilder.cpp
+++ b/clang/lib/AST/VTableBuilder.cpp
@@ -2414,6 +2414,9 @@ public:
typedef llvm::DenseMap<GlobalDecl, MethodVFTableLocation>
MethodVFTableLocationsTy;
+ typedef llvm::iterator_range<MethodVFTableLocationsTy::const_iterator>
+ method_locations_range;
+
private:
/// VTables - Global vtable information.
MicrosoftVTableContext &VTables;
@@ -2576,12 +2579,9 @@ public:
ThunksMapTy::const_iterator thunks_end() const { return Thunks.end(); }
- MethodVFTableLocationsTy::const_iterator vtable_indices_begin() const {
- return MethodVFTableLocations.begin();
- }
-
- MethodVFTableLocationsTy::const_iterator vtable_indices_end() const {
- return MethodVFTableLocations.end();
+ method_locations_range vtable_locations() const {
+ return method_locations_range(MethodVFTableLocations.begin(),
+ MethodVFTableLocations.end());
}
uint64_t getNumVTableComponents() const { return Components.size(); }
@@ -3291,9 +3291,15 @@ void MicrosoftVTableContext::computeVTableRelatedInformation(
VFTableLayouts[id] = new VTableLayout(
Builder.getNumVTableComponents(), Builder.vtable_component_begin(),
VTableThunks.size(), VTableThunks.data(), EmptyAddressPointsMap, true);
- NewMethodLocations.insert(Builder.vtable_indices_begin(),
- Builder.vtable_indices_end());
Thunks.insert(Builder.thunks_begin(), Builder.thunks_end());
+
+ for (const auto &I : Builder.vtable_locations()) {
+ GlobalDecl GD = I.first;
+ MethodVFTableLocation NewLoc = I.second;
+ auto M = NewMethodLocations.find(GD);
+ if (M == NewMethodLocations.end() || NewLoc < M->second)
+ NewMethodLocations[GD] = NewLoc;
+ }
}
MethodVFTableLocations.insert(NewMethodLocations.begin(),
OpenPOWER on IntegriCloud