Shiyao Ge via llvm-dev
2019-Jun-29 00:58 UTC
[llvm-dev] storage class 0 symbol is generated for a double constant in COFF-x86-64 object file
Hi, I am using the llvm codegen facility (version 7.0.1) to translate LLVM IR for different platforms. I have this error particularly in win64 platform. In my IR code I have such code snippet: %50 = call i8* @my_function(i8* %48, double 2.000000e+00, double 2.000000e+00) ... declare dllimport i8* @my_function(i8*, double, double) By passing it to llc.exe, I find following symbol is declared in object file's symbol table. [10](sec 5)(fl 0x00)(ty 0)(scl 0) (nx 0) 0x00000000 __real at 4000000000000000 which has storage class 0, and it will lead to an error when I try to link it with the rest of objects. obj1.obj: Unrecognized storage class 0 for .rdata symbol `__real at 4000000000000000'. As comparison, I compile an equivalent c file (to my llvm asm file) using clang-7.0 and emit the llvm from there. For this particular line, I see no difference in terms of syntax, except clang generates bunch of function attributes to the function declaration. I pass the clang generated llvm asm to llc and find the output object file also has one symbol has the same name, but the storage class is set to 2. [10](sec 5)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __real at 4000000000000000 That will probably resolve the linkage error issue. But I don't understand what's the key factor to determine the storage class and what change should I put into my generated IR. Moreover, I looked up the microsoft doc about storage class. The storage class 2 is described as "A value that Microsoft tools use for external symbols. " It doesn't sound like a symbol represents a floating point constant at all. Due to my limited knowledge of PE COFF and llvm codegen for windows platform, I am totally confused here. Any suggestion and hint are desperately welcomed! -- Shiyao Ge (Gracia) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190628/a1a0d04a/attachment.html>
Reid Kleckner via llvm-dev
2019-Jul-01 20:45 UTC
[llvm-dev] storage class 0 symbol is generated for a double constant in COFF-x86-64 object file
I can't speak for what past versions of LLVM used to do, but I can see that
today for this IR, we generate an external symbol __real at 40...:
declare dllimport void @my_function(double, double)
define i32 @main() {
call void @my_function(double 2.000000e+00, double 2.000000e+00)
ret i32 0
}
$ dumpbin -symbols t.o
...
006 00000000 SECT4 notype Static | .rdata
Section length 8, #relocs 0, #linenums 0, checksum 76DC4190,
selection 2 (pick any)
008 00000000 SECT4 notype External | __real at 4000000000000000
...
If you can provide complete IR on which llc produces a 0 storage class,
that would be interesting, but otherwise there's not much we can do.
On Fri, Jun 28, 2019 at 5:59 PM Shiyao Ge via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Hi,
>
> I am using the llvm codegen facility (version 7.0.1) to translate LLVM IR
> for different platforms. I have this error particularly in win64 platform.
> In my IR code I have such code snippet:
>
> %50 = call i8* @my_function(i8* %48, double 2.000000e+00, double
> 2.000000e+00)
> ...
> declare dllimport i8* @my_function(i8*, double, double)
>
> By passing it to llc.exe, I find following symbol is declared in object
> file's symbol table.
>
> [10](sec 5)(fl 0x00)(ty 0)(scl 0) (nx 0) 0x00000000
> __real at 4000000000000000
>
> which has storage class 0, and it will lead to an error when I try to link
> it with the rest of objects.
>
> obj1.obj: Unrecognized storage class 0 for .rdata symbol
> `__real at 4000000000000000'.
>
>
> As comparison, I compile an equivalent c file (to my llvm asm file) using
> clang-7.0 and emit the llvm from there. For this particular line, I see no
> difference in terms of syntax, except clang generates bunch of function
> attributes to the function declaration. I pass the clang generated llvm asm
> to llc and find the output object file also has one symbol has the same
> name, but the storage class is set to 2.
>
> [10](sec 5)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000
> __real at 4000000000000000
>
> That will probably resolve the linkage error issue. But I don't
understand
> what's the key factor to determine the storage class and what change
should
> I put into my generated IR.
>
> Moreover, I looked up the microsoft doc about storage class. The storage
> class 2 is described as "A value that Microsoft tools use for external
> symbols. " It doesn't sound like a symbol represents a floating
point
> constant at all.
>
> Due to my limited knowledge of PE COFF and llvm codegen for windows
> platform, I am totally confused here. Any suggestion and hint are
> desperately welcomed!
> --
> Shiyao Ge (Gracia)
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20190701/46ce2eed/attachment.html>
Shiyao Ge via llvm-dev
2019-Jul-02 00:37 UTC
[llvm-dev] storage class 0 symbol is generated for a double constant in COFF-x86-64 object file
Hi Reid, Sure. Here I attach the trimmed IR(sim_0.ll) which llc.exe takes and produces a 0 storage class symbol. The IR is fairly long but there is only 1 usage of real constant as actual argument passing to function iki_vlog_time() at line 137. The version of llc.exe is $ llc.exe --version LLVM (http://llvm.org/): LLVM version 7.0.1 DEBUG build. Default target: x86_64-pc-win32 Host CPU: skylake The command I use to produce PE object is: llc.exe -filetype=obj -O0 sim_0.ll -o sim_0.obj Reid Kleckner <rnk at google.com> 于2019年7月1日周一 下午1:45写道:> I can't speak for what past versions of LLVM used to do, but I can see > that today for this IR, we generate an external symbol __real at 40...: > > declare dllimport void @my_function(double, double) > define i32 @main() { > call void @my_function(double 2.000000e+00, double 2.000000e+00) > ret i32 0 > } > > $ dumpbin -symbols t.o > ... > 006 00000000 SECT4 notype Static | .rdata > Section length 8, #relocs 0, #linenums 0, checksum 76DC4190, > selection 2 (pick any) > 008 00000000 SECT4 notype External | __real at 4000000000000000 > ... > > If you can provide complete IR on which llc produces a 0 storage class, > that would be interesting, but otherwise there's not much we can do. > > On Fri, Jun 28, 2019 at 5:59 PM Shiyao Ge via llvm-dev < > llvm-dev at lists.llvm.org> wrote: > >> Hi, >> >> I am using the llvm codegen facility (version 7.0.1) to translate LLVM IR >> for different platforms. I have this error particularly in win64 platform. >> In my IR code I have such code snippet: >> >> %50 = call i8* @my_function(i8* %48, double 2.000000e+00, double >> 2.000000e+00) >> ... >> declare dllimport i8* @my_function(i8*, double, double) >> >> By passing it to llc.exe, I find following symbol is declared in object >> file's symbol table. >> >> [10](sec 5)(fl 0x00)(ty 0)(scl 0) (nx 0) 0x00000000 >> __real at 4000000000000000 >> >> which has storage class 0, and it will lead to an error when I try to >> link it with the rest of objects. >> >> obj1.obj: Unrecognized storage class 0 for .rdata symbol >> `__real at 4000000000000000'. >> >> >> As comparison, I compile an equivalent c file (to my llvm asm file) using >> clang-7.0 and emit the llvm from there. For this particular line, I see no >> difference in terms of syntax, except clang generates bunch of function >> attributes to the function declaration. I pass the clang generated llvm asm >> to llc and find the output object file also has one symbol has the same >> name, but the storage class is set to 2. >> >> [10](sec 5)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 >> __real at 4000000000000000 >> >> That will probably resolve the linkage error issue. But I don't >> understand what's the key factor to determine the storage class and what >> change should I put into my generated IR. >> >> Moreover, I looked up the microsoft doc about storage class. The storage >> class 2 is described as "A value that Microsoft tools use for external >> symbols. " It doesn't sound like a symbol represents a floating point >> constant at all. >> >> Due to my limited knowledge of PE COFF and llvm codegen for windows >> platform, I am totally confused here. Any suggestion and hint are >> desperately welcomed! >> -- >> Shiyao Ge (Gracia) >> >> >> _______________________________________________ >> LLVM Developers mailing list >> llvm-dev at lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >-- Shiyao Ge (Gracia) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190701/c0245110/attachment-0001.html> -------------- next part -------------- A non-text attachment was scrubbed... Name: sim_0.ll Type: application/octet-stream Size: 39912 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190701/c0245110/attachment-0001.obj>