creating new Metadata

Dear llvm-ers,
I am trying to attach a customized metadata to llvm instructions.
Let’s say, I want to attach some number to each instruction.
I am trying to use

void Instruction::setMetadata(unsigned KindID, MDNode* Node)

but I am not sure how to create a brand new instance of an MDNode.
Do you have any code samples demonstrating how to do that?

Due to some tool dependencies, I am using LLVM 2.7

Thank you,
Oksana

Dear llvm-ers,
I am trying to attach a customized metadata to llvm instructions.
Let's say, I want to attach some number to each instruction.
I am trying to use

void Instruction::setMetadata(unsigned KindID, MDNode* Node)

but I am not sure how to create a brand new instance of an MDNode.
Do you have any code samples demonstrating how to do that?

Due to some tool dependencies, I am using LLVM 2.7

  `grep -r MDNode` in $LLVM_SOURCE may give you some examples. I don't know if
there is a doxygen for LLVM 2.7, but you can see include/llvm/Metadata.h and
unittests/VMCore/MetadataTest.cpp to know how to create a MDNode. Below is code
snipt taken form MetadataTest.cpp.

Dear llvm-ers,
I am trying to attach a customized metadata to llvm instructions.
Let's say, I want to attach some number to each instruction.
I am trying to use

void Instruction::setMetadata(unsigned KindID, MDNode* Node)

but I am not sure how to create a brand new instance of an MDNode.
Do you have any code samples demonstrating how to do that?

Due to some tool dependencies, I am using LLVM 2.7

   `grep -r MDNode` in $LLVM_SOURCE may give you some examples. I don't know if
there is a doxygen for LLVM 2.7, but you can see include/llvm/Metadata.h and
unittests/VMCore/MetadataTest.cpp to know how to create a MDNode. Below is code
snipt taken form MetadataTest.cpp.

There's example code in SAFECode for LLVM 2.7 for attaching metadata:

http://llvm.org/viewvc/llvm-project/safecode/branches/release_27/lib/Utility/PoolHandles.cpp?revision=135925&view=markup

Look at PoolMDPass::createPoolMetaData().

-- John T.

Hello,
Thank you very much for the pointers.
I am are able to create new MDNodes, filled with some constants, and attach them
to llvm instructions. However, the metadata map is not getting updated as expected.
For example, instead of the expected new entry

!n = metadata !{some values}

we are getting

!n = metadata !{null}

Do you know what might be wrong? Do we need to enter the MDNodes into the map explicitly?

Thank you,
Oksana

I am are able to create new MDNodes, filled with some constants, and attach
them
to llvm instructions. However, the metadata map is not getting updated as
expected.
For example, instead of the expected new entry

!n = metadata !{some values}

we are getting

!n = metadata !{null}

Do you know what might be wrong? Do we need to enter the MDNodes into the
map explicitly?

  Maybe you can give us code snipt which you use to attach MDNode?

Regards,
chenwj

Hello,
Thank you very much for the pointers.
I am are able to create new MDNodes, filled with some constants, and attach them
to llvm instructions. However, the metadata map is not getting updated as expected.
For example, instead of the expected new entry

If you look at PoolMDPass::runOnModule(), you’ll see that the MDNodes are stored in a container (ValueToPoolNodes) and that they are added as operands to a NamedMDNode. I think you have to make your MDNodes operands of a NamedMDNode in order to get them to work properly.

– John T.

Hello,
we figured out our problem: we were not grabbing the right context.
Here is a snippet of code that works for us, in case somebody would like to know:

//iterate over instructions

ConstantInt CI = ConstantInt::get(getGlobalContext(), APInt(8, n));
SmallVector<Value
, 1> V;
V.push_back(CI);
MDNode *Node = MDNode::get(Ins->getContext(), V.data(), V.size());

Inst->setMetadata(“mydata”, Node);

Cheers,
Oksana