[LLVMdev] How to get line number of a function in a bitcode file?

1,083 views
Skip to first unread message

kobe James

unread,
Jul 8, 2011, 2:56:31 PM7/8/11
to llv...@cs.uiuc.edu
Hi All,

I hope to get some information about functions in a bitcode file. Say, if we have a function foo(), and the bitcode file is generated by a single source file, then I want to get the line number foo() locates in that source file.
If the bitcode file is linked by multiple bitcode files, is it possible to also get which file foo() locates in?

Thanks,
Chen

John Criswell

unread,
Jul 8, 2011, 5:08:39 PM7/8/11
to kobe James, llv...@cs.uiuc.edu
I think you can get this information by looking at the debugging metadata that is associated with the function or with one of its arguments.  That said, this will only work if debugging metadata is available (e.g., if the code was compiled with the -g flag).

-- John T.

Thanks,
Chen


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

Devang Patel

unread,
Jul 8, 2011, 5:09:46 PM7/8/11
to kobe James, llv...@cs.uiuc.edu
Hi Chen,
If bitcocd file has debug info, it is possible however there is not any LLVM IR ready made function to get this info. It is easy to write one.

-
Devang

John Criswell

unread,
Jul 8, 2011, 5:29:21 PM7/8/11
to Devang Patel, llv...@cs.uiuc.edu
There is code to do this in the DebugInstrumentation.cpp file in my SAFECode patch to LLVM mainline.  You can find the patch at http://llvm.cs.uiuc.edu/~criswell/sc.tar.gz.

-- John T.



-
Devang

Chen Liu

unread,
Jul 10, 2011, 10:10:32 AM7/10/11
to llv...@cs.uiuc.edu

I tried to install the SAFECode in LLVM 2.6 following the instruction in
Install.html. But when I do the step:
# cd projects/poolalloc
# make

I get the errore below:
llvm[2]: Compiling qsort.c for Release build (bytecode)
llvm[2]: Compiling strdup.c for Release build (bytecode)
llvm[2]: Compiling qsort.c for Release build
llvm[2]: Compiling strdup.c for Release build
llvm[2]: Compiling qsort.ll to qsort.bc for Release build (bytecode)
llvm[2]: Compiling strdup.ll to strdup.bc for Release build (bytecode)
/home/chenliu/llvm-2.6/llvm/Release/bin/llvm-as: assembly parsed, but does
not verify as correct!
Intrinsic prototype has incorrect number of arguments!
void (i8*, i8*, i64, i32, i1)* @llvm.memcpy.p0i8.p0i8.i64
Broken module found, compilation terminated.
Broken module found, compilation terminated.
/home/chenliu/llvm-2.6/llvm/Release/bin/opt: Invalid bitcode signature
make[2]: ***
[/home/chenliu/llvm-2.6/llvm/projects/poolalloc/runtime/PreRT/Release/strdup.bc]
Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory
`/home/chenliu/llvm-2.6/llvm/projects/poolalloc/runtime/PreRT'
make[1]: *** [all] Error 1
make[1]: Leaving directory
`/home/chenliu/llvm-2.6/llvm/projects/poolalloc/runtime'
make: *** [all] Error 1

--
View this message in context: http://old.nabble.com/How-to-get-line-number-of-a-function-in-a-bitcode-file--tp32023834p32031825.html
Sent from the LLVM - Dev mailing list archive at Nabble.com.

John Criswell

unread,
Jul 11, 2011, 11:04:37 AM7/11/11
to Chen Liu, llv...@cs.uiuc.edu
On 7/10/11 9:10 AM, Chen Liu wrote:
> I tried to install the SAFECode in LLVM 2.6 following the instruction in
> Install.html. But when I do the step:

First, if you're wanting the code in DebugInstrumentation.cpp, you need
to get the version in my patch
(http://llvm.cs.uiuc.edu/~criswell/sc.tar.gz). The debug metadata API
changed between LLVM 2.6 and LLVM 2.7, so if you're working with
mainline LLVM, you should get the newer version of the code that is
available in the patch.

Second, to answer your specific question, I believe you have a
mismatched version of llvm-gcc or Clang. Please see my answer on svadev
this morning to the same issue:
http://lists.cs.uiuc.edu/pipermail/svadev/2011-July/000086.html; this
will hopefully fix your problem if, in fact, you do want to compile
SAFECode.

-- John T.

_______________________________________________

Lu Zhao

unread,
Jul 21, 2011, 2:13:18 PM7/21/11
to Devang Patel, llv...@cs.uiuc.edu
I'm using the following code to get source information about functions
without using an instruction of the function, and it seems to work well.

// Get metadata about functions (subprograms)
if (NamedMDNode *namedMD =
km->module->getNamedMetadata("llvm.dbg.sp")) {
for (unsigned i = 0, e = namedMD->getNumOperands(); i != e; ++i) {
MDNode *mdnode = namedMD->getOperand(i);
DIDescriptor diDesc(mdnode);
if (!diDesc.isSubprogram())
continue;

DISubprogram subProg(mdnode);
unsigned line = subProg.getLineNumber();
StringRef dir = subProg.getDirectory();
StringRef file = subProg.getFilename();
std::cout << "Function name: " << subProg.getName().str()
<< " at line "
<< line << " in " << dir.str() << file.str() << "\n";
}
}


The way that elements of a metadata node is called "operands" confused
me very much. After I figured it out that it actually means a referred
(sub-)node or (sub-)element of a node, it's really straightforward to
use metadata information.

Lu

Lu Zhao

unread,
Jul 21, 2011, 2:15:58 PM7/21/11
to Devang Patel, llv...@cs.uiuc.edu
Sorry, I directly copied the code from my file without editing it.

"km->module" in the code is a pointer to a Module, which contains all
named metadata.


I'm using the following code to get source information about functions
without using an instruction of the function, and it seems to work well.

// Get metadata about functions (subprograms)
if (NamedMDNode *namedMD =
km->module->getNamedMetadata("llvm.dbg.sp")) {
for (unsigned i = 0, e = namedMD->getNumOperands(); i != e; ++i) {
MDNode *mdnode = namedMD->getOperand(i);
DIDescriptor diDesc(mdnode);
if (!diDesc.isSubprogram())
continue;

DISubprogram subProg(mdnode);
unsigned line = subProg.getLineNumber();
StringRef dir = subProg.getDirectory();
StringRef file = subProg.getFilename();
std::cout << "Function name: " << subProg.getName().str()
<< " at line "
<< line << " in " << dir.str() << file.str() << "\n";
}
}


The way that elements of a metadata node is called "operands" confused
me very much. After I figured it out that it actually means a referred
(sub-)node or (sub-)element of a node, it's really straightforward to
use metadata information.

Lu

On 07/08/2011 02:09 PM, Devang Patel wrote:

Reply all
Reply to author
Forward
0 new messages