[llvm-dev] storage class 0 symbol is generated for a double constant in COFF-x86-64 object file

Shiyao Ge via llvm-dev llvm-dev at lists.llvm.org
Fri Jun 28 17:58:58 PDT 2019


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>


More information about the llvm-dev mailing list