}
};
+ /// Structure to represent an optional metadata field.
+ template <class FieldTy> struct MDFieldImpl {
+ typedef MDFieldImpl ImplTy;
+ FieldTy Val;
+ bool Seen;
+
+ void assign(FieldTy Val) {
+ Seen = true;
+ this->Val = Val;
+ }
+
+ explicit MDFieldImpl(FieldTy Default) : Val(Default), Seen(false) {}
+ };
+ template <class NumTy> struct MDUnsignedField : public MDFieldImpl<NumTy> {
+ typedef typename MDUnsignedField::ImplTy ImplTy;
+ NumTy Max;
+
+ MDUnsignedField(NumTy Default = 0,
+ NumTy Max = std::numeric_limits<NumTy>::max())
+ : ImplTy(Default), Max(Max) {}
+ };
+ struct MDField : public MDFieldImpl<Metadata *> {
+ MDField() : ImplTy(nullptr) {}
+ };
+
class LLParser {
public:
typedef LLLexer::LocTy LocTy;
std::vector<std::pair<Type*, LocTy> > NumberedTypes;
std::vector<TrackingMDNodeRef> NumberedMetadata;
- std::map<unsigned, std::pair<MDNodeFwdDecl *, LocTy>> ForwardRefMDNodes;
+ std::map<unsigned, std::pair<MDTuple *, LocTy>> ForwardRefMDNodes;
// Global Value reference information.
std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals;
bool ParseValueAsMetadata(Metadata *&MD, PerFunctionState *PFS);
bool ParseMetadata(Metadata *&MD, PerFunctionState *PFS);
bool ParseMDTuple(MDNode *&MD, bool IsDistinct = false);
+ bool ParseMDNode(MDNode *&MD);
+ bool ParseMDNodeTail(MDNode *&MD);
bool ParseMDNodeVector(SmallVectorImpl<Metadata *> &MDs);
bool ParseInstructionMetadata(Instruction *Inst, PerFunctionState *PFS);
+ bool ParseMDField(LocTy Loc, StringRef Name,
+ MDUnsignedField<uint32_t> &Result);
+ bool ParseMDField(LocTy Loc, StringRef Name, MDField &Result);
+ template <class ParserTy> bool ParseMDFieldsImpl(ParserTy parseField);
+ bool ParseSpecializedMDNode(MDNode *&N, bool IsDistinct = false);
+ bool ParseMDLocation(MDNode *&Result, bool IsDistinct);
+
// Function Parsing.
struct ArgInfo {
LocTy Loc;