[LLVMdev] compile error when using overloaded = operator of DenseMap

Rekha R
Mon, 04 Nov 2013 18:54:20 -0000

Thank you Benjamin. I did what you suggested and got the code working.
But this I did mechanically, by looking at some example code.

Could you explain the functions - getEmptyKey, getTombstoneKey,
getHashValue, and isEqual?
Also, the need for redefining them.

Regards,
Rekha


On Mon, Nov 4, 2013 at 5:16 PM, Benjamin Kramer <benny.kra at gmail.com>
wrote:

> On Mon, Nov 4, 2013 at 10:35 AM, Rekha R <rekharamapai at nitc.ac.in>
wrote:
> > Hi,
> >
> > I am trying to implement Available Expressions data flow analysis. I
> created
> > the following class (I am giving here code snippet.):
> >
> > namespace {
> >   typedef DenseMap<Expression, uint32_t> DMTy;  //Expression is
a class I
> > defined.
> >   struct DataFlowValue {
> >     DMTy ExprMap;
> >     llvm::BitVector* DFV;
> >
> >   // Functions operating on the data //
> >     bool operator==(const DataFlowValue V) const;
> >     void top();  /* set all elements */
> >     void bot();  /* reset all elements */
> >     void set(DMTy emap);
> >     void merge(DataFlowValue V);  /* confluence operation  */
> >   };
> > }
> >
> > with the following function definition:
> >
> > void DataFlowValue::set(DMTy emap) {
> >   ExprMap = *emap;    //Line153:
> > }
> >
> > When I compile, I get the following error:
> >
> > /home/zeus/masterLLVM/llvm/include/llvm/ADT/DenseMap.h: In member
> function
> > ‘void llvm::DenseMapBase<DerivedT, KeyT, ValueT,
KeyInfoT>::destroyAll()
> > [with DerivedT = llvm::DenseMap<{anonymous}::Expression, unsigned
int>,
> KeyT
> > = {anonymous}::Expression, ValueT = unsigned int, KeyInfoT > >
llvm::DenseMapInfo<{anonymous}::Expression>]’:
> > /home/zeus/masterLLVM/llvm/include/llvm/ADT/DenseMap.h:600:5:
> instantiated
> > from ‘void llvm::DenseMap<KeyT, ValueT,
KeyInfoT>::copyFrom(const
> > llvm::DenseMap<KeyT, ValueT, KeyInfoT>&) [with KeyT >
> {anonymous}::Expression, ValueT = unsigned int, KeyInfoT > >
llvm::DenseMapInfo<{anonymous}::Expression>, llvm::DenseMap<KeyT,
ValueT,
> > KeyInfoT> = llvm::DenseMap<{anonymous}::Expression, unsigned
int>]’
> > /home/zeus/masterLLVM/llvm/include/llvm/ADT/DenseMap.h:585:5:
> instantiated
> > from ‘llvm::DenseMap<KeyT, ValueT, KeyInfoT>&
llvm::DenseMap<KeyT,
> ValueT,
> > KeyInfoT>::operator=(const llvm::DenseMap<KeyT, ValueT,
KeyInfoT>&) [with
> > KeyT = {anonymous}::Expression, ValueT = unsigned int, KeyInfoT >
> llvm::DenseMapInfo<{anonymous}::Expression>, llvm::DenseMap<KeyT,
ValueT,
> > KeyInfoT> = llvm::DenseMap<{anonymous}::Expression, unsigned
int>]’
> > /home/zeus/masterLLVM/llvm/lib/Analysis/AVEAnalysis.cpp:153:13:
> > instantiated from here
> > /home/zeus/masterLLVM/llvm/include/llvm/ADT/DenseMap.h:256:7: error:
> > ‘isEqual’ is not a member of
> ‘llvm::DenseMapInfo<{anonymous}::Expression>’
> > /home/zeus/masterLLVM/llvm/include/llvm/ADT/DenseMap.h:256:7: error:
> > ‘isEqual’ is not a member of
> ‘llvm::DenseMapInfo<{anonymous}::Expression>’
> >
> > Can someone help me solve the error?
>
> To use DenseMap with your own class as a key you have to specialize
> DenseMapInfo first, DenseMapInfo.h has some examples.
>
> In particular you have to set aside two special values as "empty"
and
> "tombstone" (deleted) keys that can not occur in normal
Expressions.
> Then you have to define a hash function for Expression and implement
> isEqual, which will likely just call operator== on your objects.
>
> See also http://llvm.org/docs/ProgrammersManual.html#llvm-adt-densemap-h
>
> - Ben
>



--
Rekha
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20131105/3a55a62d/attachment.html>