diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-31 19:27:28 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-31 19:27:28 +0000 | 
| commit | ec304151b74f9254d7029ee4d197ce1f7cbe501a (patch) | |
| tree | 63e4ed55e4fbb581fd4731d44a327a7b3278e0a1 /lib/IR | |
| parent | 67c32a98315f785a9ec9d531c1f571a0196c7463 (diff) | |
Notes
Diffstat (limited to 'lib/IR')
| -rw-r--r-- | lib/IR/Core.cpp | 22 | ||||
| -rw-r--r-- | lib/IR/LegacyPassManager.cpp | 36 | 
2 files changed, 40 insertions, 18 deletions
| diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index a25c4d66d3bb..753d9c229eca 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -563,9 +563,23 @@ LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) {    return nullptr;  } -void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef MD) { -  MDNode *N = -      MD ? cast<MDNode>(unwrap<MetadataAsValue>(MD)->getMetadata()) : nullptr; +// MetadataAsValue uses a canonical format which strips the actual MDNode for +// MDNode with just a single constant value, storing just a ConstantAsMetadata +// This undoes this canonicalization, reconstructing the MDNode. +static MDNode *extractMDNode(MetadataAsValue *MAV) { +  Metadata *MD = MAV->getMetadata(); +  assert((isa<MDNode>(MD) || isa<ConstantAsMetadata>(MD)) && +      "Expected a metadata node or a canonicalized constant"); + +  if (MDNode *N = dyn_cast<MDNode>(MD)) +    return N; + +  return MDNode::get(MAV->getContext(), MD); +} + +void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef Val) { +  MDNode *N = Val ? extractMDNode(unwrap<MetadataAsValue>(Val)) : nullptr; +    unwrap<Instruction>(Inst)->setMetadata(KindID, N);  } @@ -795,7 +809,7 @@ void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char* name,      return;    if (!Val)      return; -  N->addOperand(cast<MDNode>(unwrap<MetadataAsValue>(Val)->getMetadata())); +  N->addOperand(extractMDNode(unwrap<MetadataAsValue>(Val)));  }  /*--.. Operations on scalar constants ......................................--*/ diff --git a/lib/IR/LegacyPassManager.cpp b/lib/IR/LegacyPassManager.cpp index b9ab25651fa2..fa8d50ec160c 100644 --- a/lib/IR/LegacyPassManager.cpp +++ b/lib/IR/LegacyPassManager.cpp @@ -600,8 +600,7 @@ void PMTopLevelManager::schedulePass(Pass *P) {    // If P is an analysis pass and it is available then do not    // generate the analysis again. Stale analysis info should not be    // available at this point. -  const PassInfo *PI = -    PassRegistry::getPassRegistry()->getPassInfo(P->getPassID()); +  const PassInfo *PI = findAnalysisPassInfo(P->getPassID());    if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) {      delete P;      return; @@ -619,7 +618,7 @@ void PMTopLevelManager::schedulePass(Pass *P) {        Pass *AnalysisPass = findAnalysisPass(*I);        if (!AnalysisPass) { -        const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(*I); +        const PassInfo *PI = findAnalysisPassInfo(*I);          if (!PI) {            // Pass P is not in the global PassRegistry @@ -716,8 +715,7 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {        return *I;      // If Pass not found then check the interfaces implemented by Immutable Pass -    const PassInfo *PassInf = -      PassRegistry::getPassRegistry()->getPassInfo(PI); +    const PassInfo *PassInf = findAnalysisPassInfo(PI);      assert(PassInf && "Expected all immutable passes to be initialized");      const std::vector<const PassInfo*> &ImmPI =        PassInf->getInterfacesImplemented(); @@ -731,6 +729,17 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) {    return nullptr;  } +const PassInfo *PMTopLevelManager::findAnalysisPassInfo(AnalysisID AID) const { +  const PassInfo *&PI = AnalysisPassInfos[AID]; +  if (!PI) +    PI = PassRegistry::getPassRegistry()->getPassInfo(AID); +  else +    assert(PI == PassRegistry::getPassRegistry()->getPassInfo(AID) && +           "The pass info pointer changed for an analysis ID!"); + +  return PI; +} +  // Print passes managed by this top level manager.  void PMTopLevelManager::dumpPasses() const { @@ -759,8 +768,7 @@ void PMTopLevelManager::dumpArguments() const {    dbgs() << "Pass Arguments: ";    for (SmallVectorImpl<ImmutablePass *>::const_iterator I =         ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I) -    if (const PassInfo *PI = -        PassRegistry::getPassRegistry()->getPassInfo((*I)->getPassID())) { +    if (const PassInfo *PI = findAnalysisPassInfo((*I)->getPassID())) {        assert(PI && "Expected all immutable passes to be initialized");        if (!PI->isAnalysisGroup())          dbgs() << " -" << PI->getPassArgument(); @@ -824,7 +832,7 @@ void PMDataManager::recordAvailableAnalysis(Pass *P) {    // This pass is the current implementation of all of the interfaces it    // implements as well. -  const PassInfo *PInf = PassRegistry::getPassRegistry()->getPassInfo(PI); +  const PassInfo *PInf = TPM->findAnalysisPassInfo(PI);    if (!PInf) return;    const std::vector<const PassInfo*> &II = PInf->getInterfacesImplemented();    for (unsigned i = 0, e = II.size(); i != e; ++i) @@ -957,7 +965,7 @@ void PMDataManager::freePass(Pass *P, StringRef Msg,    }    AnalysisID PI = P->getPassID(); -  if (const PassInfo *PInf = PassRegistry::getPassRegistry()->getPassInfo(PI)) { +  if (const PassInfo *PInf = TPM->findAnalysisPassInfo(PI)) {      // Remove the pass itself (if it is not already removed).      AvailableAnalysis.erase(PI); @@ -1037,7 +1045,7 @@ void PMDataManager::add(Pass *P, bool ProcessAnalysis) {    for (SmallVectorImpl<AnalysisID>::iterator           I = ReqAnalysisNotAvailable.begin(),           E = ReqAnalysisNotAvailable.end() ;I != E; ++I) { -    const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(*I); +    const PassInfo *PI = TPM->findAnalysisPassInfo(*I);      Pass *AnalysisPass = PI->createPass();      this->addLowerLevelRequiredPass(P, AnalysisPass);    } @@ -1142,7 +1150,7 @@ void PMDataManager::dumpPassArguments() const {        PMD->dumpPassArguments();      else        if (const PassInfo *PI = -            PassRegistry::getPassRegistry()->getPassInfo((*I)->getPassID())) +            TPM->findAnalysisPassInfo((*I)->getPassID()))          if (!PI->isAnalysisGroup())            dbgs() << " -" << PI->getPassArgument();    } @@ -1218,7 +1226,7 @@ void PMDataManager::dumpAnalysisUsage(StringRef Msg, const Pass *P,    dbgs() << (const void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:";    for (unsigned i = 0; i != Set.size(); ++i) {      if (i) dbgs() << ','; -    const PassInfo *PInf = PassRegistry::getPassRegistry()->getPassInfo(Set[i]); +    const PassInfo *PInf = TPM->findAnalysisPassInfo(Set[i]);      if (!PInf) {        // Some preserved passes, such as AliasAnalysis, may not be initialized by        // all drivers. @@ -1658,8 +1666,8 @@ void MPPassManager::addLowerLevelRequiredPass(Pass *P, Pass *RequiredPass) {      OnTheFlyManagers[P] = FPP;    } -  const PassInfo * RequiredPassPI = -    PassRegistry::getPassRegistry()->getPassInfo(RequiredPass->getPassID()); +  const PassInfo *RequiredPassPI = +      TPM->findAnalysisPassInfo(RequiredPass->getPassID());    Pass *FoundPass = nullptr;    if (RequiredPassPI && RequiredPassPI->isAnalysis()) { | 
