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