diff options
author | Zachary Turner <zturner@google.com> | 2016-08-05 23:12:31 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-08-05 23:12:31 +0000 |
commit | 9e91c28b7121f726b3ee62bd5d17abb9bfe6841a (patch) | |
tree | 5a3b6513de1f6fcef809f0152d098f6e8e609ece /llvm | |
parent | 796a3e2bdd2710275c4871d00616b5b84aae2e32 (diff) | |
download | bcm5719-llvm-9e91c28b7121f726b3ee62bd5d17abb9bfe6841a.tar.gz bcm5719-llvm-9e91c28b7121f726b3ee62bd5d17abb9bfe6841a.zip |
Resubmit "Make YAML support SmallVector"
This resubmits a3770391c5fb64108d565e12f61dd77ce71b5b4f,
which was reverted due to breakages on non-Windows machines.
Due to differences in template instantiation rules on Microsoft
and non-Microsoft platforms, a member access restriction was
triggering on non-Microsoft compilers. Previously, a friend
declaration for std::vector<> had been introduced into the
DebugMap class to make the member access restriction pass,
but the introduction of support for SmallVector<> meant that
an additional friend declaration would need to be added.
This didn't really make a lot of sense since the user of the
macro is probably only using one type (SmallVector<>, vector<>,
etc) and we could in theory add support for even more types
to this macro in the future (e.g. std::deque), so rather than
add another friend declaration, I just made the type being
referenced a public nested typedef instead of a private nested
typedef.
llvm-svn: 277888
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/Support/YAMLTraits.h | 91 | ||||
-rw-r--r-- | llvm/tools/dsymutil/DebugMap.h | 3 |
2 files changed, 45 insertions, 49 deletions
diff --git a/llvm/include/llvm/Support/YAMLTraits.h b/llvm/include/llvm/Support/YAMLTraits.h index bc3fa8ad11d..7389dc232ec 100644 --- a/llvm/include/llvm/Support/YAMLTraits.h +++ b/llvm/include/llvm/Support/YAMLTraits.h @@ -1359,66 +1359,63 @@ operator<<(Output &yout, T &seq) { return yout; } +template <typename T> struct SequenceTraitsImpl { + typedef typename T::value_type _type; + static size_t size(IO &io, T &seq) { return seq.size(); } + static _type &element(IO &io, T &seq, size_t index) { + if (index >= seq.size()) + seq.resize(index + 1); + return seq[index]; + } +}; + } // namespace yaml } // namespace llvm /// Utility for declaring that a std::vector of a particular type /// should be considered a YAML sequence. -#define LLVM_YAML_IS_SEQUENCE_VECTOR(_type) \ - namespace llvm { \ - namespace yaml { \ - template<> \ - struct SequenceTraits< std::vector<_type> > { \ - static size_t size(IO &io, std::vector<_type> &seq) { \ - return seq.size(); \ - } \ - static _type& element(IO &io, std::vector<_type> &seq, size_t index) {\ - if ( index >= seq.size() ) \ - seq.resize(index+1); \ - return seq[index]; \ - } \ - }; \ - } \ +#define LLVM_YAML_IS_SEQUENCE_VECTOR(_type) \ + namespace llvm { \ + namespace yaml { \ + template <> \ + struct SequenceTraits<std::vector<_type>> \ + : public SequenceTraitsImpl<std::vector<_type>> {}; \ + template <unsigned N> \ + struct SequenceTraits<SmallVector<_type, N>> \ + : public SequenceTraitsImpl<SmallVector<_type, N>> {}; \ + } \ } /// Utility for declaring that a std::vector of a particular type /// should be considered a YAML flow sequence. -#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(_type) \ - namespace llvm { \ - namespace yaml { \ - template<> \ - struct SequenceTraits< std::vector<_type> > { \ - static size_t size(IO &io, std::vector<_type> &seq) { \ - return seq.size(); \ - } \ - static _type& element(IO &io, std::vector<_type> &seq, size_t index) {\ - (void)flow; /* Remove this workaround after PR17897 is fixed */ \ - if ( index >= seq.size() ) \ - seq.resize(index+1); \ - return seq[index]; \ - } \ - static const bool flow = true; \ - }; \ - } \ +#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(_type) \ + namespace llvm { \ + namespace yaml { \ + template <unsigned N> \ + struct SequenceTraits<SmallVector<_type, N>> \ + : public SequenceTraitsImpl<SmallVector<_type, N>> { \ + static const bool flow = true; \ + }; \ + template <> \ + struct SequenceTraits<std::vector<_type>> \ + : public SequenceTraitsImpl<std::vector<_type>> { \ + static const bool flow = true; \ + }; \ + } \ } /// Utility for declaring that a std::vector of a particular type /// should be considered a YAML document list. -#define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type) \ - namespace llvm { \ - namespace yaml { \ - template<> \ - struct DocumentListTraits< std::vector<_type> > { \ - static size_t size(IO &io, std::vector<_type> &seq) { \ - return seq.size(); \ - } \ - static _type& element(IO &io, std::vector<_type> &seq, size_t index) {\ - if ( index >= seq.size() ) \ - seq.resize(index+1); \ - return seq[index]; \ - } \ - }; \ - } \ +#define LLVM_YAML_IS_DOCUMENT_LIST_VECTOR(_type) \ + namespace llvm { \ + namespace yaml { \ + template <unsigned N> \ + struct DocumentListTraits<SmallVector<_type, N>> \ + : public SequenceTraitsImpl<SmallVector<_type, N>> {}; \ + template <> \ + struct DocumentListTraits<std::vector<_type>> \ + : public SequenceTraitsImpl<std::vector<_type>> {}; \ + } \ } #endif // LLVM_SUPPORT_YAMLTRAITS_H diff --git a/llvm/tools/dsymutil/DebugMap.h b/llvm/tools/dsymutil/DebugMap.h index 1a3d62b67b7..639f5037f47 100644 --- a/llvm/tools/dsymutil/DebugMap.h +++ b/llvm/tools/dsymutil/DebugMap.h @@ -130,6 +130,7 @@ public: SymbolMapping() = default; }; + typedef std::pair<std::string, SymbolMapping> YAMLSymbolMapping; typedef StringMapEntry<SymbolMapping> DebugMapEntry; /// \brief Adds a symbol mapping to this DebugMapObject. @@ -170,10 +171,8 @@ private: /// For YAMLIO support. ///@{ - typedef std::pair<std::string, SymbolMapping> YAMLSymbolMapping; friend yaml::MappingTraits<dsymutil::DebugMapObject>; friend yaml::SequenceTraits<std::vector<std::unique_ptr<DebugMapObject>>>; - friend yaml::SequenceTraits<std::vector<YAMLSymbolMapping>>; DebugMapObject() = default; public: |