Rekha R
2013-Nov-04 09:35 UTC
[LLVMdev] compile error when using overloaded = operator of DenseMap
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? -- Rekha -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131104/bfe2b3f4/attachment.html>
Benjamin Kramer
2013-Nov-04 11:46 UTC
[LLVMdev] compile error when using overloaded = operator of DenseMap
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 R
2013-Nov-04 18:54 UTC
[LLVMdev] compile error when using overloaded = operator of DenseMap
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>
Seemingly Similar Threads
- [LLVMdev] compile error when using overloaded = operator of DenseMap
- [LLVMdev] changes to raw_fd_ostream
- [LLVMdev] changes to raw_fd_ostream
- [LLVMdev] changes to raw_fd_ostream
- [LLVMdev] [NVPTX] Strange assertion around BlockToChain.clear(); in Release+Asserts build