From bad06b13bac2c7f59d804c8f90caedc63978276d Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 5 Nov 2014 18:16:03 +0000 Subject: [PATCH] IR: MDNode => Value: NamedMDNode::getOperator() Change `NamedMDNode::getOperator()` from returning `MDNode *` to returning `Value *`. To reduce boilerplate at some call sites, add a `getOperatorAsMDNode()` for named metadata that's expected to only return `MDNode` -- for now, that's everything, but debug node named metadata (such as llvm.dbg.cu and llvm.dbg.sp) will soon change. This is part of PR21433. Note that there's a follow-up patch to clang for the API change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221375 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/Metadata.h | 15 +++++++++------ lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 2 +- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 8 ++++---- lib/IR/Core.cpp | 6 +++--- lib/IR/DebugInfo.cpp | 8 ++++---- lib/IR/Metadata.cpp | 13 ++++++------- lib/IR/Module.cpp | 3 ++- lib/IR/TypeFinder.cpp | 2 +- lib/IR/Verifier.cpp | 6 +++--- lib/Linker/LinkModules.cpp | 4 ++-- lib/Target/NVPTX/NVPTXGenericToNVVM.cpp | 2 +- lib/Target/NVPTX/NVPTXUtilities.cpp | 2 +- .../Instrumentation/AddressSanitizer.cpp | 4 +++- lib/Transforms/Instrumentation/DebugIR.cpp | 2 +- lib/Transforms/Instrumentation/GCOVProfiling.cpp | 8 ++++---- lib/Transforms/ObjCARC/ObjCARCContract.cpp | 2 +- tools/opt/BreakpointPrinter.cpp | 2 +- 17 files changed, 47 insertions(+), 42 deletions(-) diff --git a/include/llvm/IR/Metadata.h b/include/llvm/IR/Metadata.h index db072ca6616..fa325e7adb5 100644 --- a/include/llvm/IR/Metadata.h +++ b/include/llvm/IR/Metadata.h @@ -237,10 +237,10 @@ private: }; //===----------------------------------------------------------------------===// -/// \brief A tuple of MDNodes. +/// \brief A tuple of metadata nodes. /// /// Despite its name, a NamedMDNode isn't itself an MDNode. NamedMDNodes belong -/// to modules, have names, and contain lists of MDNodes. +/// to modules, have names, and contain lists of metadata nodes. class NamedMDNode : public ilist_node { friend class SymbolTableListTraits; friend struct ilist_traits; @@ -250,7 +250,7 @@ class NamedMDNode : public ilist_node { std::string Name; Module *Parent; - void *Operands; // SmallVector, 4> + void *Operands; // SmallVector, 4> void setParent(Module *M) { Parent = M; } @@ -305,7 +305,10 @@ public: inline Module *getParent() { return Parent; } inline const Module *getParent() const { return Parent; } - MDNode *getOperand(unsigned i) const; + Value *getOperand(unsigned i) const; + MDNode *getOperandAsMDNode(unsigned i) const { + return cast_or_null(getOperand(i)); + } unsigned getNumOperands() const; void addOperand(Value *M); StringRef getName() const; @@ -315,11 +318,11 @@ public: // --------------------------------------------------------------------------- // Operand Iterator interface... // - typedef op_iterator_impl op_iterator; + typedef op_iterator_impl op_iterator; op_iterator op_begin() { return op_iterator(this, 0); } op_iterator op_end() { return op_iterator(this, getNumOperands()); } - typedef op_iterator_impl const_op_iterator; + typedef op_iterator_impl const_op_iterator; const_op_iterator op_begin() const { return const_op_iterator(this, 0); } const_op_iterator op_end() const { return const_op_iterator(this, getNumOperands()); } diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index e8bff7c6de5..ba42742dd35 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -1398,7 +1398,7 @@ void AsmPrinter::EmitModuleIdents(Module &M) { if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) { for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { - const MDNode *N = NMD->getOperand(i); + const MDNode *N = NMD->getOperandAsMDNode(i); assert(N->getNumOperands() == 1 && "llvm.ident metadata entry can have only one operand"); const MDString *S = cast(N->getOperand(0)); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 4acd7271be9..9523446bd22 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -450,8 +450,8 @@ void DwarfDebug::beginModule() { SingleCU = CU_Nodes->getNumOperands() == 1; - for (MDNode *N : CU_Nodes->operands()) { - DICompileUnit CUNode(N); + for (Value *N : CU_Nodes->operands()) { + DICompileUnit CUNode(cast(N)); DwarfCompileUnit &CU = constructDwarfCompileUnit(CUNode); DIArray ImportedEntities = CUNode.getImportedEntities(); for (unsigned i = 0, e = ImportedEntities.getNumElements(); i != e; ++i) @@ -526,8 +526,8 @@ void DwarfDebug::collectDeadVariables() { const Module *M = MMI->getModule(); if (NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu")) { - for (MDNode *N : CU_Nodes->operands()) { - DICompileUnit TheCU(N); + for (Value *N : CU_Nodes->operands()) { + DICompileUnit TheCU(cast(N)); // Construct subprogram DIE and add variables DIEs. DwarfCompileUnit *SPCU = static_cast(CUMap.lookup(TheCU)); diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index f6ab9197244..7e60e05fd00 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -560,8 +560,8 @@ LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) { } void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef MD) { - unwrap(Inst)->setMetadata(KindID, - MD ? unwrap(MD) : nullptr); + unwrap(Inst) + ->setMetadata(KindID, MD ? unwrap(MD) : nullptr); } /*--.. Conversion functions ................................................--*/ @@ -720,7 +720,7 @@ void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char* name, NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name); if (!N) return; - MDNode *Op = Val ? unwrap(Val) : nullptr; + Value *Op = Val ? unwrap(Val) : nullptr; if (Op) N->addOperand(Op); } diff --git a/lib/IR/DebugInfo.cpp b/lib/IR/DebugInfo.cpp index 60904c2b356..38389e8ca1e 100644 --- a/lib/IR/DebugInfo.cpp +++ b/lib/IR/DebugInfo.cpp @@ -949,7 +949,7 @@ DITypeIdentifierMap llvm::generateDITypeIdentifierMap(const NamedMDNode *CU_Nodes) { DITypeIdentifierMap Map; for (unsigned CUi = 0, CUe = CU_Nodes->getNumOperands(); CUi != CUe; ++CUi) { - DICompileUnit CU(CU_Nodes->getOperand(CUi)); + DICompileUnit CU(CU_Nodes->getOperandAsMDNode(CUi)); DIArray Retain = CU.getRetainedTypes(); for (unsigned Ti = 0, Te = Retain.getNumElements(); Ti != Te; ++Ti) { if (!Retain.getElement(Ti).isCompositeType()) @@ -997,7 +997,7 @@ void DebugInfoFinder::processModule(const Module &M) { InitializeTypeMap(M); if (NamedMDNode *CU_Nodes = M.getNamedMetadata("llvm.dbg.cu")) { for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { - DICompileUnit CU(CU_Nodes->getOperand(i)); + DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i)); addCompileUnit(CU); DIArray GVs = CU.getGlobalVariables(); for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) { @@ -1542,8 +1542,8 @@ llvm::makeSubprogramMap(const Module &M) { if (!CU_Nodes) return R; - for (MDNode *N : CU_Nodes->operands()) { - DICompileUnit CUNode(N); + for (Value *N : CU_Nodes->operands()) { + DICompileUnit CUNode(cast(N)); DIArray SPs = CUNode.getSubprograms(); for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { DISubprogram SP(SPs.getElement(i)); diff --git a/lib/IR/Metadata.cpp b/lib/IR/Metadata.cpp index 3806fe4fd4e..59beb734184 100644 --- a/lib/IR/Metadata.cpp +++ b/lib/IR/Metadata.cpp @@ -555,14 +555,13 @@ MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) { // NamedMDNode implementation. // -static SmallVector, 4> &getNMDOps(void *Operands) { - return *(SmallVector, 4>*)Operands; +static SmallVector, 4> &getNMDOps(void *Operands) { + return *(SmallVector, 4> *)Operands; } NamedMDNode::NamedMDNode(const Twine &N) - : Name(N.str()), Parent(nullptr), - Operands(new SmallVector, 4>()) { -} + : Name(N.str()), Parent(nullptr), + Operands(new SmallVector, 4>()) {} NamedMDNode::~NamedMDNode() { dropAllReferences(); @@ -573,7 +572,7 @@ unsigned NamedMDNode::getNumOperands() const { return (unsigned)getNMDOps(Operands).size(); } -MDNode *NamedMDNode::getOperand(unsigned i) const { +Value *NamedMDNode::getOperand(unsigned i) const { assert(i < getNumOperands() && "Invalid Operand number!"); return &*getNMDOps(Operands)[i]; } @@ -582,7 +581,7 @@ void NamedMDNode::addOperand(Value *V) { auto *M = cast(V); assert(!M->isFunctionLocal() && "NamedMDNode operands must not be function-local!"); - getNMDOps(Operands).push_back(TrackingVH(M)); + getNMDOps(Operands).push_back(TrackingVH(M)); } void NamedMDNode::eraseFromParent() { diff --git a/lib/IR/Module.cpp b/lib/IR/Module.cpp index e35eefbd45c..35d28481fcb 100644 --- a/lib/IR/Module.cpp +++ b/lib/IR/Module.cpp @@ -276,7 +276,8 @@ getModuleFlagsMetadata(SmallVectorImpl &Flags) const { const NamedMDNode *ModFlags = getModuleFlagsMetadata(); if (!ModFlags) return; - for (const MDNode *Flag : ModFlags->operands()) { + for (const Value *FlagMD : ModFlags->operands()) { + const MDNode *Flag = cast(FlagMD); ModFlagBehavior MFB; if (Flag->getNumOperands() >= 3 && isValidModFlagBehavior(Flag->getOperand(0), MFB) && diff --git a/lib/IR/TypeFinder.cpp b/lib/IR/TypeFinder.cpp index d1d8e1381be..3aae4e69ec1 100644 --- a/lib/IR/TypeFinder.cpp +++ b/lib/IR/TypeFinder.cpp @@ -81,7 +81,7 @@ void TypeFinder::run(const Module &M, bool onlyNamed) { E = M.named_metadata_end(); I != E; ++I) { const NamedMDNode *NMD = I; for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) - incorporateMDNode(NMD->getOperand(i)); + incorporateMDNode(NMD->getOperandAsMDNode(i)); } } diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index 1c54e9b062e..395f2e74d61 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -555,7 +555,7 @@ void Verifier::visitGlobalAlias(const GlobalAlias &GA) { void Verifier::visitNamedMDNode(const NamedMDNode &NMD) { for (unsigned i = 0, e = NMD.getNumOperands(); i != e; ++i) { - MDNode *MD = NMD.getOperand(i); + MDNode *MD = NMD.getOperandAsMDNode(i); if (!MD) continue; @@ -624,7 +624,7 @@ void Verifier::visitModuleIdents(const Module &M) { // llvm.ident takes a list of metadata entry. Each entry has only one string. // Scan each llvm.ident entry and make sure that this requirement is met. for (unsigned i = 0, e = Idents->getNumOperands(); i != e; ++i) { - const MDNode *N = Idents->getOperand(i); + const MDNode *N = Idents->getOperandAsMDNode(i); Assert1(N->getNumOperands() == 1, "incorrect number of operands in llvm.ident metadata", N); Assert1(isa(N->getOperand(0)), @@ -642,7 +642,7 @@ void Verifier::visitModuleFlags(const Module &M) { DenseMap SeenIDs; SmallVector Requirements; for (unsigned I = 0, E = Flags->getNumOperands(); I != E; ++I) { - visitModuleFlag(Flags->getOperand(I), SeenIDs, Requirements); + visitModuleFlag(Flags->getOperandAsMDNode(I), SeenIDs, Requirements); } // Validate that the requirements in the module are valid. diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index bac187bb3a3..3a2eb6c178c 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -1287,7 +1287,7 @@ bool ModuleLinker::linkModuleFlagsMetadata() { DenseMap Flags; SmallSetVector Requirements; for (unsigned I = 0, E = DstModFlags->getNumOperands(); I != E; ++I) { - MDNode *Op = DstModFlags->getOperand(I); + MDNode *Op = DstModFlags->getOperandAsMDNode(I); ConstantInt *Behavior = cast(Op->getOperand(0)); MDString *ID = cast(Op->getOperand(1)); @@ -1302,7 +1302,7 @@ bool ModuleLinker::linkModuleFlagsMetadata() { // requirements. bool HasErr = false; for (unsigned I = 0, E = SrcModFlags->getNumOperands(); I != E; ++I) { - MDNode *SrcOp = SrcModFlags->getOperand(I); + MDNode *SrcOp = SrcModFlags->getOperandAsMDNode(I); ConstantInt *SrcBehavior = cast(SrcOp->getOperand(0)); MDString *ID = cast(SrcOp->getOperand(1)); MDNode *DstOp = Flags.lookup(ID); diff --git a/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp b/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp index 58fa95b54ac..496cfbd7955 100644 --- a/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp +++ b/lib/Target/NVPTX/NVPTXGenericToNVVM.cpp @@ -371,7 +371,7 @@ void GenericToNVVM::remapNamedMDNode(Module *M, NamedMDNode *N) { // Check if any operand is or contains a global variable in GVMap, and thus // converted to another value. for (unsigned i = 0; i < NumOperands; ++i) { - MDNode *Operand = N->getOperand(i); + MDNode *Operand = cast(N->getOperand(i)); MDNode *NewOperand = remapMDNode(M, Operand); OperandChanged |= Operand != NewOperand; NewOperands.push_back(NewOperand); diff --git a/lib/Target/NVPTX/NVPTXUtilities.cpp b/lib/Target/NVPTX/NVPTXUtilities.cpp index d6a14250a43..f1a9a6cc1ea 100644 --- a/lib/Target/NVPTX/NVPTXUtilities.cpp +++ b/lib/Target/NVPTX/NVPTXUtilities.cpp @@ -73,7 +73,7 @@ static void cacheAnnotationFromMD(const Module *m, const GlobalValue *gv) { return; key_val_pair_t tmp; for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { - const MDNode *elem = NMD->getOperand(i); + const MDNode *elem = NMD->getOperandAsMDNode(i); Value *entity = elem->getOperand(0); // entity may be null due to DCE diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 2d5eb0ac4e2..906de7e4fda 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -256,7 +256,9 @@ class GlobalsMetadata { NamedMDNode *Globals = M.getNamedMetadata("llvm.asan.globals"); if (!Globals) return; - for (auto MDN : Globals->operands()) { + for (const Value *MDV : Globals->operands()) { + const MDNode *MDN = cast(MDV); + // Metadata node contains the global and the fields of "Entry". assert(MDN->getNumOperands() == 5); Value *V = MDN->getOperand(0); diff --git a/lib/Transforms/Instrumentation/DebugIR.cpp b/lib/Transforms/Instrumentation/DebugIR.cpp index 5234341b32e..7a0ed81eed6 100644 --- a/lib/Transforms/Instrumentation/DebugIR.cpp +++ b/lib/Transforms/Instrumentation/DebugIR.cpp @@ -474,7 +474,7 @@ bool getSourceInfoFromDI(const Module &M, std::string &Directory, if (!CUNode || CUNode->getNumOperands() == 0) return false; - DICompileUnit CU(CUNode->getOperand(0)); + DICompileUnit CU(cast(CUNode->getOperand(0))); if (!CU.Verify()) return false; diff --git a/lib/Transforms/Instrumentation/GCOVProfiling.cpp b/lib/Transforms/Instrumentation/GCOVProfiling.cpp index 0baa1c494e5..72b49a6cce3 100644 --- a/lib/Transforms/Instrumentation/GCOVProfiling.cpp +++ b/lib/Transforms/Instrumentation/GCOVProfiling.cpp @@ -417,7 +417,7 @@ namespace { std::string GCOVProfiler::mangleName(DICompileUnit CU, const char *NewStem) { if (NamedMDNode *GCov = M->getNamedMetadata("llvm.gcov")) { for (int i = 0, e = GCov->getNumOperands(); i != e; ++i) { - MDNode *N = GCov->getOperand(i); + MDNode *N = GCov->getOperandAsMDNode(i); if (N->getNumOperands() != 2) continue; MDString *GCovFile = dyn_cast(N->getOperand(0)); MDNode *CompileUnit = dyn_cast(N->getOperand(1)); @@ -479,7 +479,7 @@ void GCOVProfiler::emitProfileNotes() { // this pass over the original .o's as they're produced, or run it after // LTO, we'll generate the same .gcno files. - DICompileUnit CU(CU_Nodes->getOperand(i)); + DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i)); std::error_code EC; raw_fd_ostream out(mangleName(CU, "gcno"), EC, sys::fs::F_None); std::string EdgeDestinations; @@ -565,7 +565,7 @@ bool GCOVProfiler::emitProfileArcs() { bool Result = false; bool InsertIndCounterIncrCode = false; for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { - DICompileUnit CU(CU_Nodes->getOperand(i)); + DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i)); DIArray SPs = CU.getSubprograms(); SmallVector, 8> CountersBySP; for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { @@ -846,7 +846,7 @@ Function *GCOVProfiler::insertCounterWriteout( NamedMDNode *CU_Nodes = M->getNamedMetadata("llvm.dbg.cu"); if (CU_Nodes) { for (unsigned i = 0, e = CU_Nodes->getNumOperands(); i != e; ++i) { - DICompileUnit CU(CU_Nodes->getOperand(i)); + DICompileUnit CU(CU_Nodes->getOperandAsMDNode(i)); std::string FilenameGcda = mangleName(CU, "gcda"); uint32_t CfgChecksum = FileChecksums.empty() ? 0 : FileChecksums[i]; Builder.CreateCall3(StartFile, diff --git a/lib/Transforms/ObjCARC/ObjCARCContract.cpp b/lib/Transforms/ObjCARC/ObjCARCContract.cpp index eb325eb9417..04a0d917224 100644 --- a/lib/Transforms/ObjCARC/ObjCARCContract.cpp +++ b/lib/Transforms/ObjCARC/ObjCARCContract.cpp @@ -305,7 +305,7 @@ bool ObjCARCContract::doInitialization(Module &M) { if (NamedMDNode *NMD = M.getNamedMetadata("clang.arc.retainAutoreleasedReturnValueMarker")) if (NMD->getNumOperands() == 1) { - const MDNode *N = NMD->getOperand(0); + const MDNode *N = NMD->getOperandAsMDNode(0); if (N->getNumOperands() == 1) if (const MDString *S = dyn_cast(N->getOperand(0))) RetainRVMarker = S; diff --git a/tools/opt/BreakpointPrinter.cpp b/tools/opt/BreakpointPrinter.cpp index 44f4a11773e..e557875546a 100644 --- a/tools/opt/BreakpointPrinter.cpp +++ b/tools/opt/BreakpointPrinter.cpp @@ -55,7 +55,7 @@ struct BreakpointPrinter : public ModulePass { if (NamedMDNode *NMD = M.getNamedMetadata("llvm.dbg.sp")) for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { std::string Name; - DISubprogram SP(NMD->getOperand(i)); + DISubprogram SP(cast_or_null(NMD->getOperand(i))); assert((!SP || SP.isSubprogram()) && "A MDNode in llvm.dbg.sp should be null or a DISubprogram."); if (!SP) -- 2.34.1