[LLVMdev] int to StringRed conversion

426 views
Skip to first unread message

Alexandru Ionut Diaconescu

unread,
May 2, 2013, 9:53:59 AM5/2/13
to llv...@cs.uiuc.edu
Hello everyone,

I have an integer and I want to convert it to StringRef in order to set metadata.
setMetadata->(StringRef, MDNode*);

It is there a native LLVM way to do it?

1. In the llvm::APSInt Class is toString() method, which seems it is not for this purpose
2. itoa and string are not part of LLVM
3. stringstream is not part of LLVM
4. to_string is not part of LLVM
5. any casting method?

Also, I would like to get the metadata and convert it back to integer.

Thank you !

Logan Chien

unread,
May 2, 2013, 10:42:33 AM5/2/13
to Alexandru Ionut Diaconescu, llv...@cs.uiuc.edu
Hi,

  I think you may try to use llvm::Twine(int).  For example, to convert 30 to string, you can use:

Twine(30).str()

To convert the string back to integer, you can try the StringRef::getAsInteger(unsigned, APInt &).  For example:

APInt i;
str.getAsInteger(/*radix=*/ 10, /*output=*/ i);

Sincerely,
Logan



_______________________________________________
LLVM Developers mailing list
LLV...@cs.uiuc.edu         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev


Alexandru Ionut Diaconescu

unread,
May 2, 2013, 10:59:14 AM5/2/13
to Logan Chien, llv...@cs.uiuc.edu
Thank you for your help!

Almost solved my problem. Now I don't have any compilation errors. I have only one segfault:

opt: LLVMContext.cpp:147: unsigned int llvm::LLVMContext::getMDKindID(llvm::StringRef) const: Assertion `isValidName(Name) && "Invalid MDNode name"' failed.

This is due because when I setMetadata() it failes.

StringRef tsts = llvm::Twine(srsr).str();
....
LLVMContext& C = is->getContext();
MDNode* N = MDNode::get(C, MDString::get(C, "path"));
is->setMetadata(tsts, N);


If I put
is->setMetadata("marked", N);, it goes ok and the .bc is modified. But if I directly put tsts it failes...

and the definition is :
void Instruction::setMetadata ( StringRef  Kind,


MDNode Node 

)

I don't know how I can use the tsts parameter..

Thank you again !
--
Best regards,
Alexandru Ionut Diaconescu

Alexandru Ionut Diaconescu

unread,
May 2, 2013, 11:10:22 AM5/2/13
to Logan Chien, llv...@cs.uiuc.edu
The problem is that I want to pass only srsr which is an int. "marked" was just an example :)

Thanks you!


On Thu, May 2, 2013 at 5:06 PM, Logan Chien <tzuhsia...@gmail.com> wrote:
I'm not familiar with this, but maybe you can try:

StringRef tst = ("marked" + Twine(srsr)).str();

It seems that you can't use integer as meta data kind name.

Logan

Logan Chien

unread,
May 2, 2013, 11:43:04 AM5/2/13
to Alexandru Ionut Diaconescu, llv...@cs.uiuc.edu
I think the better solution should be:


LLVMContext& C = is->getContext();
Value *values[] = {
  ConstantInt::getSigned(Type::getInt64Ty(C), scsr),
  MDString::get(C, "path")
};

lnstr.setMetadata("your_analysis_name", MDNode::get(C, values));

So that you can take advantage of the type system of LLVM bitcode, and don't have to cast the integers from/to strings by yourself.

Logan

Alexandru Ionut Diaconescu

unread,
May 2, 2013, 12:39:37 PM5/2/13
to Logan Chien, llv...@cs.uiuc.edu
Yes, it sounds good. I can try tomorrow.

Thank you for your advice !

Alexandru Ionut Diaconescu

unread,
May 3, 2013, 4:21:31 AM5/3/13
to Logan Chien, llv...@cs.uiuc.edu
Thank you very much ! It works ! And also I can get metadata accordingly.
Reply all
Reply to author
Forward
0 new messages