Hi
One would expect this, its a facility of the C++ language. The anonymous
namespace is, essentially, the same as declaring everything in it
static. That is, the symbols are not exported and not available for
linking.
Yes, it was pretty clear after finding out that this isn't a linking error
which i suspected...
> So for all those trying to add an analysis path:
> * add the object name to the USEDLIBS variable in the tools/llc/Makefile
> * use the llvm namespace instead of anonyous
These statements are only true if you're adding an analysis pass to
LLVM. If the pass is for use outside of LLVM then you want to:
<snip>
Yes, but this is already documented on the Website and works really well :-).
> This mail is intended as references for people using the search engines,
> prior to asking questions :-). But maybe this information could also be
> added to http://llvm.org/docs/WritingAnLLVMPass.html?
Such a patch would be readily accepted.
Ok, if i get my pass flying i'll write s.t. unfortunatly i hit another
roadblock:
Everthing now compiles fine, but when running llc with invoking my own backend
derived from the cbackend i get the following error:
llc -f -march my_backend a.out.bc
llc: PassManagerT.h:387: void llvm::PassManagerT<Trait>::markPassUsed(const
llvm::PassInfo*, llvm::Pass*) [with Trait = llvm::MTraits]: Assertion
`getAnalysisOrNullUp(P) &&
dynamic_cast<ImmutablePass*>(getAnalysisOrNullUp(P)) && "Pass available but
not found! " "Perhaps this is a module pass requiring a function pass?"'
failed.
llc((anonymous namespace)::PrintStackTrace()+0x1f)[0x880791f]
/lib/tls/libc.so.6(abort+0x1d2)[0xb7d00fa2]
/lib/tls/libc.so.6(__assert_fail+0x10f)[0xb7cf92df]
llc(llvm::PassManagerT<llvm::MTraits>::markPassUsed(llvm::PassInfo const*,
llvm::Pass*)+0xf6)[0x8736c36]
Aborted
The requirements of this pass are quite modest:
void MParSchedule::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
}
The Header looks of this pass looks like this:
namespace llvm {
class MParSchedule : public BasicBlockPass {
public:
virtual bool runOnBasicBlock(BasicBlock &B);
void getAnalysisUsage(AnalysisUsage &AU) const;
virtual void releaseMemory();
map<const BasicBlock *,list<Schedule*> *>
BlockSchedule;
list<Schedule*>* lookupBasicBlock(BasicBlock *);
private:
bool in_ValueList(Value *val);
list<const Value*> ValueList;
list<Instruction*> InstructionList;
};
};
It gets Registered in the cpp file via:
RegisterAnalysis<MParSchedule> X("MParSchedule","Maximal Parallel Schedule");
This pass has been tested as optimization pass with opt, and everything worked
in this configuration.
Thanks
ST