comparison gen/tollvm.cpp @ 920:545f54041d91

Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :) Fixed align N; in asm blocks. Fixed inreg parameter passing on x86 for ref/out params. Removed support for lazy initialization of function local static variables, I have no idea why I ever implemented this, it's not in the D spec, and DMD doesn't support it :P Some of the global variable related changes might cause minor regressions, but they should be easily fixable.
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Tue, 03 Feb 2009 08:54:57 +0100
parents a4fcc13da3cd
children 39519a1ff603
comparison
equal deleted inserted replaced
919:c76f74d09fb1 920:545f54041d91
292 return llvm::GlobalValue::InternalLinkage; 292 return llvm::GlobalValue::InternalLinkage;
293 // intrinsics are always external 293 // intrinsics are always external
294 if (fdecl->llvmInternal == LLVMintrinsic) 294 if (fdecl->llvmInternal == LLVMintrinsic)
295 return llvm::GlobalValue::ExternalLinkage; 295 return llvm::GlobalValue::ExternalLinkage;
296 // template instances should have weak linkage 296 // template instances should have weak linkage
297 // but only if there's a body, otherwise we make it external 297 // but only if there's a body, and it's not naked
298 else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody) 298 // otherwise we make it external
299 else if (DtoIsTemplateInstance(fdecl) && fdecl->fbody && !fdecl->naked)
299 return TEMPLATE_LINKAGE_TYPE; 300 return TEMPLATE_LINKAGE_TYPE;
300 // extern(C) functions are always external 301 // extern(C) functions are always external
301 else if (ft->linkage == LINKc) 302 else if (ft->linkage == LINKc)
302 return llvm::GlobalValue::ExternalLinkage; 303 return llvm::GlobalValue::ExternalLinkage;
303 } 304 }