Неопределенный символ для загружаемого модуля LoopPass

Я создаю проход цикла, следуя этим инструкциям: http://llvm.org/docs/WritingAnLLVMPass.html Все работает нормально, я делал это много раз для проходов функций, но в методе runOnLoop всякий раз, когда я вызываю метод цикла L, переданный в качестве аргумента, например L->begin(), я получаю следующую ошибку:

opt: ошибка поиска символа: /home/giacomo/llvmcsfv/Debug+Asserts/lib/Acsl.so: неопределенный символ: _ZNK4llvm8LoopBaseINS_10BasicBlockENS_4LoopEE5beginEv

Где Acsl — имя загружаемого модуля. Если убрать все инструкции из runOnPass кроме отладочной печати, то работает нормально (она ее печатает), значит проблема не в модуле. У кого-нибудь есть идея?

это код перехода преобразования:

//===- AcslDCEE.cpp - Acsl Dead Code Elimination -----------------*- C++ -*-===//
//
//         The LLVM Compiler Infrastructure - CSFV Annotation Framework
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements a Dead Code Elimination that uses ACSL annotations
//
//===----------------------------------------------------------------------===//    

#define DEBUG_TYPE "licm"
#include "llvm/Transforms/Scalar.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/AliasSetTracker.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/Dominators.h"
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Analysis/LoopInfo.h"
#include "llvm/Analysis/LoopPass.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Metadata.h"
#include "llvm/Support/CFG.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetLibraryInfo.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/SSAUpdater.h"
#include <algorithm>
using namespace llvm;    

// STATISTIC(AcslNumSunk      , "Number of instructions sunk out of loop");
// STATISTIC(AcslNumHoisted   , "Number of instructions hoisted out of loop");
// STATISTIC(AcslNumMovedLoads, "Number of load insts hoisted or sunk");
// STATISTIC(AcslNumMovedCalls, "Number of call insts hoisted or sunk");
// STATISTIC(AcslNumPromoted  , "Number of memory locations promoted to registers");    

namespace {
struct AcslDCEE: public LoopPass {
  static char ID; // Pass identification, replacement for typeid
  AcslDCEE() :
      LoopPass(ID) {}    

  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
    AU.setPreservesCFG();
    AU.addRequired<DominatorTree>();
    AU.addRequired<LoopInfo>();
    AU.addRequiredID(LoopSimplifyID);
    AU.addRequired<AliasAnalysis>();
    AU.addPreserved<AliasAnalysis>();
    AU.addPreserved("scalar-evolution");
    AU.addPreservedID(LoopSimplifyID);
    AU.addRequired<TargetLibraryInfo>();
  }    

  /**
   * The runOnFunction method must be implemented by your subclass to do the
   * transformation or analysis work of your pass. As usual, a true value
   * should be returned if the function is modified.
   */
  virtual bool runOnLoop(Loop *L, LPPassManager &LPM){
    bool Changed = false;
    LI = &getAnalysis<LoopInfo>();
    AA = &getAnalysis<AliasAnalysis>();
    DT = &getAnalysis<DominatorTree>();    

    TD = getAnalysisIfAvailable<DataLayout>();
    TLI = &getAnalysis<TargetLibraryInfo>();    

    errs() << "before!\n";
    L->begin();
    errs() << "after!\n";
    return Changed;
  }    

  /**
   * The doInitialization method is designed to do simple initialization type
   * of stuff that does not depend on the functions being processed.
   * The doInitialization method call is not scheduled to overlap with any
   * other pass executions.
   */
  // virtual bool doInitialization(Loop *L, LPPassManager &LPM){
  //   errs() << "###Acsl DCEeeeea###\n";
  //   L->dump();
  //   errs() << "uhm...\n";
  //   return LoopPass::doInitialization(L,LPM);
  //   // return true;
  // }    

  // /**
  //  * The doFinalization method is an infrequently used method that is called
  //  * when the pass framework has finished calling runOnFunction for every
  //  * function in the program being compiled.
  //  */
  // virtual bool doFinalization(Module &M) {
  //   DEBUG(errs() << "\n");
  //   return LoopPass::doFinalization(M);
  // }    

  // bool doFinalization() {
  //     DEBUG(errs() << "\n");
  //     return LoopPass::doFinalization();
  //   }    

private:    

  AliasAnalysis *AA;       // Current AliasAnalysis information
  LoopInfo      *LI;       // Current LoopInfo
  DominatorTree *DT;       // Dominator Tree for the current Loop.    

  DataLayout *TD;          // DataLayout for constant folding.
  TargetLibraryInfo *TLI;  // TargetLibraryInfo for constant folding.    

  // State that is updated as we process loops.
  bool Changed;            // Set to true when we change anything.
  BasicBlock *Preheader;   // The preheader block of the current loop...
  Loop *CurLoop;           // The current loop we are working on...
  AliasSetTracker *CurAST; // AliasSet information for the current loop...
  bool MayThrow;           // The current loop contains an instruction which
                           // may throw, thus preventing code motion of
                           // instructions with side effects.
  DenseMap<Loop*, AliasSetTracker*> LoopToAliasSetMap;    

};
} //end of anonymous namespace    

char AcslDCEE::ID = 0;
static RegisterPass<AcslDCEE> X("acsldcee", "acsl dead code elimination");
// INITIALIZE_PASS_BEGIN(AcslDCEE, "acsldcee", "Loop Invariant Code Motion", false, false)
// // INITIALIZE_PASS_DEPENDENCY(DominatorTree)
// INITIALIZE_PASS_DEPENDENCY(LoopInfo)
// // INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
// // INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
// // INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
// INITIALIZE_PASS_END(AcslDCEE, "acsldcee", "Loop Invariant Code Motion", false, false)

person Giacomo Tagliabue    schedule 01.05.2013    source источник


Ответы (1)


Неправильное использование функции begin(). Ошибка говорит о том, что компилятор не смог найти такую ​​функцию. Беглый взгляд на справку по классу Loop говорит мне, что нет функции-члена с именем begin.

http://llvm.org/docs/doxygen/html/classllvm_1_1Loop.html

person shrm    schedule 03.05.2013
comment
begin — это функция, которая возвращает итератор в первом базовом блоке. Конечно, я не определял его, и, как я уже сказал, я могу заменить его другим методом, определенным Loop. И, кстати, это не ответ, вы должны добавить комментарий к моему вопросу, а не ответ. - person Giacomo Tagliabue; 08.05.2013
comment
Тогда я думаю, что это неправильное использование функции begin(), поскольку ошибка, похоже, говорит о том, что компилятор не смог найти такую ​​функцию. Беглый взгляд на справку по классу Loop говорит мне, что нет функции-члена с именем begin. llvm.org/docs/doxygen/html/classllvm_1_1Loop.html Я это знаю это не ответ, но в данный момент у меня недостаточно репутации, чтобы комментировать чей-то вопрос. Если это сработает, я отредактирую, чтобы сделать это ответом. - person shrm; 08.05.2013
comment
Это ответ на ваш вопрос. Пожалуйста, подумайте о том, чтобы принять его. - person shrm; 08.05.2013
comment
конечно, потому что наследуется классом loopbase... Как вы видите здесь: llvm. org/docs/doxygen/html/LICM_8cpp_source.html В этом loopPass в строке 218 L вызывает метод begin. - person Giacomo Tagliabue; 09.05.2013
comment
Если это может помочь, я добавил это. - person Giacomo Tagliabue; 09.05.2013
comment
Ах, вы пишете только L->begin();..... поэтому компилятор считает, что begin() должен возвращать void, но его возвращаемый тип — итератор цикла, как вы можете видеть в реализации LICM, на которую вы мне указали. Там написано Loop::iterator LoopItr = L->begin() - person shrm; 09.05.2013
comment
Я позволю вам предположить, что у меня их нет. Удачи. - person shrm; 09.05.2013