Thanks Duncan and Ashok, As Duncan described, "lli -load=libstdc++.dylib ..." works. I, however, encounted an "Illegal instruction" message, while I was trying to interpret a large program. So, does lli have a debug switch for dumping out the details for errors? Using llc is not that simple, and I have not gotten through the compilation process. For instance, "llc -o test.s test.bc" works and generates "test.s"; "g++ -o test.o test.s" throws out "Unknown pseudo-op: .cfi_startproc" messages, however. Not sure about the reasons yet. Xiaolong Duncan Sands wrote:> > Hi Xialong, > > > I have a program that uses C++ STL a lot. To have the source code for > > STL functions, I undefined "_GLIBCXX_EXTERN_TEMPLATE" in > > c++config.h. In spite of this, after compilation (via clang) and > > linking (via llvm-ld), the resulting bitcode contains a few declared > > functions (with no definitions). > > > > My question is: In the scenario where some function definitions are > > missing in a llvm bitcode, can we get a way to run this module via llc > > or lli? Or is there any way to make these function definitions > > available in the llvm bitcode? > > with lli, you should be able to do it by adding > -load=libstdc++.so > to the lli command line (maybe with a full path). With llc, use g++ > to the linking. For example, if llc turned bitcode.bc into bitcode.s, > do > g++ -o bitcode bitcode.s > since g++ automagically passes libstdc++ to the linker. You can also > use the system linker directly, adding the missing libraries. > > > > > Specifically, these missing functions are as below: > > > > declare i8* @llvm.eh.exception() nounwind readonly > > This is an LLVM intrinsic, so isn't really missing. > > > declare i32 @__gxx_personality_v0(...) > > This should be in libstdc++. > > > declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind > > declare void @llvm.eh.resume(i8*, i32) > > LLVM intrinsics. > > > declare void @_ZSt9terminatev() > > This should be in libstdc++. > > > declare i32 @memcmp(i8*, i8*, i64) > > In libc (libc.so) which should be pulled in by libstdc++. > > > declare i64 @llvm.expect.i64(i64, i64) nounwind readnone > > LLVM intrinsic. > > > declare void @_ZSt19__throw_logic_errorPKc(i8*) noreturn > > declare i8* @__cxa_begin_catch(i8*) > > declare void @__cxa_rethrow() > > declare void @__cxa_end_catch() > > declare void @__cxa_call_unexpected(i8*) > > declare void @_ZdlPv(i8*) nounwind > > declare void @_ZSt20__throw_length_errorPKc(i8*) noreturn > > declare void @_ZSt17__throw_bad_allocv() noreturn > > declare noalias i8* @_Znwm(i64) > > These should all be in libstdc++. > > > declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind > > declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind > > declare i32 @llvm.atomic.load.add.i32.p0i32(i32* nocapture, i32) nounwind > > declare void @llvm.memory.barrier(i1, i1, i1, i1, i1) nounwind > > LLVM intrinsics. > > > declare void @_ZSt20__throw_out_of_rangePKc(i8*) noreturn > > This should be in libstdc++. > > > declare i64 @strlen(i8*) > > declare void @abort() > > In libc (libc.so) which should be pulled in by libstdc++. > > Ciao, Duncan. > > > > > > > Xiaolong > > _______________________________________________ > > LLVM Developers mailing list > > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Hi Xiaolong,> As Duncan described, "lli -load=libstdc++.dylib ..." works. I, > however, encounted an "Illegal instruction" message, while I was > trying to interpret a large program.are you using the interpreter or the JIT? So, does lli have a debug switch> for dumping out the details for errors? > > Using llc is not that simple, and I have not gotten through the > compilation process. For instance, "llc -o test.s test.bc" works and > generates "test.s"; "g++ -o test.o test.s" throws out "Unknown > pseudo-op: .cfi_startproc" messages, however. Not sure about the > reasons yet.This means that your binutils is too old. Try passing -disable-cfi to llc. Ciao, Duncan.> > Xiaolong > > > > Duncan Sands wrote: >> >> Hi Xialong, >> >>> I have a program that uses C++ STL a lot. To have the source code for >>> STL functions, I undefined "_GLIBCXX_EXTERN_TEMPLATE" in >>> c++config.h. In spite of this, after compilation (via clang) and >>> linking (via llvm-ld), the resulting bitcode contains a few declared >>> functions (with no definitions). >>> >>> My question is: In the scenario where some function definitions are >>> missing in a llvm bitcode, can we get a way to run this module via llc >>> or lli? Or is there any way to make these function definitions >>> available in the llvm bitcode? >> >> with lli, you should be able to do it by adding >> -load=libstdc++.so >> to the lli command line (maybe with a full path). With llc, use g++ >> to the linking. For example, if llc turned bitcode.bc into bitcode.s, >> do >> g++ -o bitcode bitcode.s >> since g++ automagically passes libstdc++ to the linker. You can also >> use the system linker directly, adding the missing libraries. >> >>> >>> Specifically, these missing functions are as below: >>> >>> declare i8* @llvm.eh.exception() nounwind readonly >> >> This is an LLVM intrinsic, so isn't really missing. >> >>> declare i32 @__gxx_personality_v0(...) >> >> This should be in libstdc++. >> >>> declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind >>> declare void @llvm.eh.resume(i8*, i32) >> >> LLVM intrinsics. >> >>> declare void @_ZSt9terminatev() >> >> This should be in libstdc++. >> >>> declare i32 @memcmp(i8*, i8*, i64) >> >> In libc (libc.so) which should be pulled in by libstdc++. >> >>> declare i64 @llvm.expect.i64(i64, i64) nounwind readnone >> >> LLVM intrinsic. >> >>> declare void @_ZSt19__throw_logic_errorPKc(i8*) noreturn >>> declare i8* @__cxa_begin_catch(i8*) >>> declare void @__cxa_rethrow() >>> declare void @__cxa_end_catch() >>> declare void @__cxa_call_unexpected(i8*) >>> declare void @_ZdlPv(i8*) nounwind >>> declare void @_ZSt20__throw_length_errorPKc(i8*) noreturn >>> declare void @_ZSt17__throw_bad_allocv() noreturn >>> declare noalias i8* @_Znwm(i64) >> >> These should all be in libstdc++. >> >>> declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind >>> declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind >>> declare i32 @llvm.atomic.load.add.i32.p0i32(i32* nocapture, i32) nounwind >>> declare void @llvm.memory.barrier(i1, i1, i1, i1, i1) nounwind >> >> LLVM intrinsics. >> >>> declare void @_ZSt20__throw_out_of_rangePKc(i8*) noreturn >> >> This should be in libstdc++. >> >>> declare i64 @strlen(i8*) >>> declare void @abort() >> >> In libc (libc.so) which should be pulled in by libstdc++. >> >> Ciao, Duncan. >> >>> >>> >>> Xiaolong >>> _______________________________________________ >>> LLVM Developers mailing list >>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Hi Duncan, Thanks again.> > As Duncan described, "lli -load=libstdc++.dylib ..." works. I, > > however, encounted an "Illegal instruction" message, while I was > > trying to interpret a large program. > > are you using the interpreter or the JIT?I think, I am using the JIT, as passing -force-interpreter=true gives rise to "Could not resolve external global address: __dso_handle". The "Illegal instruction" issue might be caused by the program I attempted to run; I am investigating this issue.> So, does lli have a debug switch > > for dumping out the details for errors? > > > > Using llc is not that simple, and I have not gotten through the > > compilation process. For instance, "llc -o test.s test.bc" works and > > generates "test.s"; "g++ -o test.o test.s" throws out "Unknown > > pseudo-op: .cfi_startproc" messages, however. Not sure about the > > reasons yet. > > This means that your binutils is too old. Try passing -disable-cfi > to llc. >This option works. Actually, the version of my assembler (as) is GNU assembler version 1.38. I have no idea of the up-to-date version for working with llc, but the "-disable-cfi" options helps out, even under my outdated binutils. Best, Xiaolong> >> > >>> I have a program that uses C++ STL a lot. To have the source code for > >>> STL functions, I undefined "_GLIBCXX_EXTERN_TEMPLATE" in > >>> c++config.h. In spite of this, after compilation (via clang) and > >>> linking (via llvm-ld), the resulting bitcode contains a few declared > >>> functions (with no definitions). > >>> > >>> My question is: In the scenario where some function definitions are > >>> missing in a llvm bitcode, can we get a way to run this module via llc > >>> or lli? Or is there any way to make these function definitions > >>> available in the llvm bitcode? > >> > >> with lli, you should be able to do it by adding > >> -load=libstdc++.so > >> to the lli command line (maybe with a full path). With llc, use g++ > >> to the linking. For example, if llc turned bitcode.bc into bitcode.s, > >> do > >> g++ -o bitcode bitcode.s > >> since g++ automagically passes libstdc++ to the linker. You can also > >> use the system linker directly, adding the missing libraries. > >> > >>> > >>> Specifically, these missing functions are as below: > >>> > >>> declare i8* @llvm.eh.exception() nounwind readonly > >> > >> This is an LLVM intrinsic, so isn't really missing. > >> > >>> declare i32 @__gxx_personality_v0(...) > >> > >> This should be in libstdc++. > >> > >>> declare i32 @llvm.eh.selector(i8*, i8*, ...) nounwind > >>> declare void @llvm.eh.resume(i8*, i32) > >> > >> LLVM intrinsics. > >> > >>> declare void @_ZSt9terminatev() > >> > >> This should be in libstdc++. > >> > >>> declare i32 @memcmp(i8*, i8*, i64) > >> > >> In libc (libc.so) which should be pulled in by libstdc++. > >> > >>> declare i64 @llvm.expect.i64(i64, i64) nounwind readnone > >> > >> LLVM intrinsic. > >> > >>> declare void @_ZSt19__throw_logic_errorPKc(i8*) noreturn > >>> declare i8* @__cxa_begin_catch(i8*) > >>> declare void @__cxa_rethrow() > >>> declare void @__cxa_end_catch() > >>> declare void @__cxa_call_unexpected(i8*) > >>> declare void @_ZdlPv(i8*) nounwind > >>> declare void @_ZSt20__throw_length_errorPKc(i8*) noreturn > >>> declare void @_ZSt17__throw_bad_allocv() noreturn > >>> declare noalias i8* @_Znwm(i64) > >> > >> These should all be in libstdc++. > >> > >>> declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind > >>> declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind > >>> declare i32 @llvm.atomic.load.add.i32.p0i32(i32* nocapture, i32) nounwind > >>> declare void @llvm.memory.barrier(i1, i1, i1, i1, i1) nounwind > >> > >> LLVM intrinsics. > >> > >>> declare void @_ZSt20__throw_out_of_rangePKc(i8*) noreturn > >> > >> This should be in libstdc++. > >> > >>> declare i64 @strlen(i8*) > >>> declare void @abort() > >> > >> In libc (libc.so) which should be pulled in by libstdc++. > >> > >> Ciao, Duncan. > >> > >>> > >>> > >>> Xiaolong > >>> _______________________________________________ > >>> LLVM Developers mailing list > >>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > >>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >> > >> _______________________________________________ > >> LLVM Developers mailing list > >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >