1 //===-- llvm/CodeGen/X86COFFMachineModuleInfo.cpp -------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This is an MMI implementation for X86 COFF (windows) targets.
12 //===----------------------------------------------------------------------===//
14 #include "X86COFFMachineModuleInfo.h"
15 #include "X86MachineFunctionInfo.h"
16 #include "llvm/DerivedTypes.h"
17 #include "llvm/Function.h"
18 #include "llvm/MC/MCContext.h"
19 #include "llvm/MC/MCSymbol.h"
20 #include "llvm/Target/TargetData.h"
21 #include "llvm/ADT/SmallString.h"
22 #include "llvm/Support/raw_ostream.h"
26 X86COFFMachineModuleInfo::~X86COFFMachineModuleInfo() {
29 /// DecorateCygMingName - Query FunctionInfoMap and use this information for
30 /// various name decorations for Cygwin and MingW.
31 MCSymbol *X86COFFMachineModuleInfo::DecorateCygMingName(MCSymbol *NameSym,
34 const TargetData &TD) {
35 // We don't want to decorate non-stdcall or non-fastcall functions right now
36 CallingConv::ID CC = F->getCallingConv();
37 if (CC != CallingConv::X86_StdCall && CC != CallingConv::X86_FastCall)
40 unsigned ArgWords = 0;
42 // Calculate arguments sizes
43 for (Function::const_arg_iterator AI = F->arg_begin(), AE = F->arg_end();
45 const Type *Ty = AI->getType();
47 // 'Dereference' type in case of byval parameter attribute
48 if (AI->hasByValAttr())
49 Ty = cast<PointerType>(Ty)->getElementType();
51 // Size should be aligned to DWORD boundary
52 ArgWords += ((TD.getTypeAllocSize(Ty) + 3)/4)*4;
55 const FunctionType *FT = F->getFunctionType();
57 SmallString<128> Name(NameSym->getName().begin(), NameSym->getName().end());
59 // "Pure" variadic functions do not receive @0 suffix.
60 if (!FT->isVarArg() || FT->getNumParams() == 0 ||
61 (FT->getNumParams() == 1 && F->hasStructRetAttr()))
62 raw_svector_ostream(Name) << '@' << ArgWords;
64 if (CC == CallingConv::X86_FastCall) {
68 Name.insert(Name.begin(), '@');
71 return Ctx.GetOrCreateSymbol(Name.str());