Проблемы с LLVM при настройке прохода функций - проблемы с пространством имен - PullRequest
1 голос
/ 30 января 2012

Я заходил на этот сайт время от времени несколько лет, и сегодня я наконец задаю свой первый вопрос.Я застрял около недели на этом, и я просто недостаточно хорош в C ++ (или просто слишком много раз ездил по кругу), чтобы понять это самостоятельно.

Я используюИнфраструктура компилятора LLVM, и я настраиваю проход функций.Я делал все это раньше, но я пытаюсь написать это таким образом, чтобы включить AliasAnalysis, что потребовало от меня реструктуризации прохода.Вот где я застреваю.

Пасс вызывает различные методы и структуры данных, расположенные в 6 различных файлах.Каждый файл соответствует содержимому структуры, указанной в заголовочном файле.

Метод runOnFunction для прохода находится в RelRecovery.cpp, главном файле для этого прохода, а другие файлы предоставляют поддерживающие методы иструктуры данных.Проблема заключается в том, что мне нужно, чтобы содержимое RelRecovery было прописано в заголовочном файле, чтобы другие методы могли его использовать, но это вызывает предыдущее определение ошибки «struct RelRecovery», когда я пытаюсь скомпилировать все, так как структуратакже определено в RelRecovery.cpp.

Кроме того, макросы, которые я использую в RelRecovery.cpp для инициализации моего прохода и позволяют ему использовать информацию о профилировании зависимости от памяти, расположены в самом конце файла и вызывают специфичный для прохода метод инициализации, который яполучить сообщение об ошибке: 'void llvm :: initializeRelRecoveryPass (llvm :: PassRegistry &)' должно быть объявлено внутри 'llvm'.Когда я изменяю соответствующий файл в llvm и пытаюсь построить, я получаю эту ошибку:

In file included from /x/grwright/llvm/llvm-2.9/tools/opt/opt.cpp:40:
/x/grwright/llvm/llvm-2.9/include/llvm/LinkAllPasses.h: In constructor ‘<unnamed>::ForcePassLinking::ForcePassLinking()’:
/x/grwright/llvm/llvm-2.9/include/llvm/LinkAllPasses.h:152: error: ‘createRelRecoveryPass’ is not a member of ‘llvm’

Вот краткий обзор структуры проекта.

RelRecovery.h:

using namespace llvm;
//stuff
struct RelRecovery : public FunctionPass {
public:
  static char ID; // Pass identification, replacement for typeid
  RelRecovery() : FunctionPass(ID) {}

  virtual bool runOnFunction(Function &M);
  virtual void getAnalysisUsage(AnalysisUsage &AU) const;
  virtual bool doInitialization(Module &M);

  //lots of statics for data structures, etc
};

struct RelTrace {
public:
  //struct variables and functions
  RelTrace();
};

//other structs here

RelRecovery.cpp:

using namespace llvm;
struct RelRecovery: public FunctionPass {
    static char ID;
    RelRecovery() : FunctionPass(ID){
            initializeRelRecoveryPass(*PassRegistry::getPassRegistry());
    }

    //global static variables
    //datastructures
    //methods
};
//static definitions such as:
double RelRecovery::totStaticInstrs = 0.0;

char RelRecovery::ID = 0;
FunctionPass *createRelRecoveryPass() {
    return new RelRecovery();
}

INITIALIZE_PASS_BEGIN(RelRecovery, "relRecovery", "...", false, false)
INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
INITIALIZE_PASS_END(RelRecovery, "relRecovery", "Reliability transformation for     lightweight recovery", false, false)

RelOTHER.cpp ...

//Constructors and methods and such...

Так что, хотя ошибка файла LinkAppPasses.h раздражает,то, что я действительно хотел бы решить в первую очередь, это ошибка:

RelRecovery.cpp:49: error: redefinition of ‘struct RelRecovery’
/x/grwright/llvm/llvm-sfi/RelRecovery/include/RelRecovery.h:67: error: previous     definition of ‘struct RelRecovery’

Как мне сохранить надлежащую функциональность моего прохода и всех его файлов, просто определяя struct RelRecovery в одном месте?Я понимаю, что, вероятно, допустил много, много, ГЛАВНЫХ глупостей здесь, но я - аппаратный парень, и программирование (особенно C ++) - не моя сильная сторона.Извините, и спасибо за помощь!

1 Ответ

2 голосов
/ 31 января 2012

Похоже, это никак не связано с LLVM. Вы определенно определяете свой класс дважды - один в .h, а другой - в .cpp.

Итак, внутри .cpp вы должны предоставить внешнее определение всех методов, объявленных в .h. В вашем случае для конструктора это будет примерно так:

RelRecovery::RelRecovery() : FunctionPass(ID) {
    initializeRelRecoveryPass(*PassRegistry::getPassRegistry());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...