Я заходил на этот сайт время от времени несколько лет, и сегодня я наконец задаю свой первый вопрос.Я застрял около недели на этом, и я просто недостаточно хорош в 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 ++) - не моя сильная сторона.Извините, и спасибо за помощь!