On Sep 29, 2014, at 7:08 AM, J. E. <[email protected]> wrote:

> All good now, thanks for clarifying.
> I have converted the code to pointers and it is now compiling again.
> 
> Seems like an odd limitation though, could we actually just provide memcpy to 
> the compiler?
> (I'm no expert, just wandering)
> 

Compiler intrinsics are not standardized and can be different for different 
compilers. On IA32 64-bit math also causes intrinsics to be emitted. So a long 
time ago we decided to not provide the per compiler intrinsics. 

Thanks,

Andrew Fish

> From: [email protected]
> Date: Mon, 29 Sep 2014 06:34:47 -0700
> To: [email protected]
> Subject: Re: [edk2] Compiler inserting memcpy. Unresolved external    symbol  
> memcpy
> 
> 
> On Sep 29, 2014, at 5:39 AM, Scott Duplichan <[email protected]> wrote:
> 
> J. E. [mailto:[email protected]]  wrote:
> 
> Sent: Monday, September 29, 2014 03:24 AM
> To: [email protected]
> Subject: [edk2] Compiler inserting memcpy. Unresolved external symbol memcpy
>  
> I'm getting this error when compiling my project in X64. (But no error in 
> NT32 for some reason, probably a 32bit vs 64bit thing).
>  
> error LNK2001: unresolved external symbol memcpy
>  
> I don't use memcpy at all, I only use CopyMem. 
> So it must be the compiler optimizing code and inserting memcpy here and 
> there.
>  
> I added compile option /FAcs
> I found 20+ instances of memcpy.
>  
> Is there a trick around this so I don't have to modify lots of code?
>  
> This is a real problem with no easy solution that I know of. My rant: Why 
> doesn't EDK2 provide
> just memcpy, etc?
> For your code, passing &rcDest instead of rcDest should eliminate the memcpy 
> calls you show.
>  
> Thanks,
> Scott
>  
> If there is no way around it, should I not be parsing STRUCTS through 
> functions and use pointers instead?
> 
> 
> Yes. 
> 
> UEFI 2.4 2.3.4.2 Detailed Calling Conventions
> The caller passes the first four integer arguments in registers. The integer 
> values are passed from left to right in Rcx, Rdx, R8, and R9 registers. The 
> caller passes arguments five and above onto the stack. All arguments must be 
> right-justified in the register in which they are passed. This ensures the 
> callee can process only the bits in the register that are required.
> The caller passes arrays and strings via a pointer to memory allocated by the 
> caller. The caller passes structures and unions of size 8, 16, 32, or 64 bits 
> as if they were integers of the same size. The caller is not allowed to pass 
> structures and unions of other than these sizes and must pass these unions 
> and structures via a pointer.
> …
> 
> Thus the memcpy is the compiler enforcing the calling conventions. 
> 
> RECT A, B;
> 
> A = B;
> 
> Will also cause memcpy to be emitted. 
> 
> Thanks,
> 
> Andrew Fish 
> 
> ------------------------------------------------------------------------------
>  Slashdot TV. Videos for Nerds. Stuff that Matters. 
> http://pubads.g.doubleclick.net/gampad/clk?id=160591471&iu=/4140/ostg.clktrk
> _______________________________________________ edk2-devel mailing list 
> [email protected] 
> https://lists.sourceforge.net/lists/listinfo/edk2-devel
> ------------------------------------------------------------------------------
> Slashdot TV.  Videos for Nerds.  Stuff that Matters.
> http://pubads.g.doubleclick.net/gampad/clk?id=160591471&iu=/4140/ostg.clktrk_______________________________________________
> edk2-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/edk2-devel

------------------------------------------------------------------------------
Slashdot TV.  Videos for Nerds.  Stuff that Matters.
http://pubads.g.doubleclick.net/gampad/clk?id=160591471&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to