diff options
| author | Anton Korobeynikov <asl@math.spbu.ru> | 2006-09-20 22:03:51 +0000 |
|---|---|---|
| committer | Anton Korobeynikov <asl@math.spbu.ru> | 2006-09-20 22:03:51 +0000 |
| commit | 3c5b3df6a07bba844943abf3f8054c5b89a41f9d (patch) | |
| tree | 905287addaa29f1c661f869db347b2fff1a4d964 /llvm/lib/Target/X86/X86AsmPrinter.cpp | |
| parent | ccdaecc4486b26d6eb13adfe8e7ff52118cd9aa9 (diff) | |
| download | bcm5719-llvm-3c5b3df6a07bba844943abf3f8054c5b89a41f9d.tar.gz bcm5719-llvm-3c5b3df6a07bba844943abf3f8054c5b89a41f9d.zip | |
Adding codegeneration for StdCall & FastCall calling conventions
llvm-svn: 30549
Diffstat (limited to 'llvm/lib/Target/X86/X86AsmPrinter.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86AsmPrinter.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp index d7dc70c567a..7dcdd96592d 100644 --- a/llvm/lib/Target/X86/X86AsmPrinter.cpp +++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp @@ -17,18 +17,106 @@ #include "X86AsmPrinter.h" #include "X86ATTAsmPrinter.h" #include "X86IntelAsmPrinter.h" +#include "X86MachineFunctionInfo.h" #include "X86Subtarget.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/CallingConv.h" #include "llvm/Constants.h" #include "llvm/Module.h" #include "llvm/Type.h" #include "llvm/Assembly/Writer.h" #include "llvm/Support/Mangler.h" #include "llvm/Target/TargetAsmInfo.h" + using namespace llvm; Statistic<> llvm::EmittedInsts("asm-printer", "Number of machine instrs printed"); +static X86FunctionInfo calculateFunctionInfo(const Function* F, + const TargetData* TD) +{ + X86FunctionInfo Info; + uint64_t size = 0; + + switch (F->getCallingConv()) { + case CallingConv::X86_StdCall: + Info.setDecorationStyle(StdCall); + break; + case CallingConv::X86_FastCall: + Info.setDecorationStyle(FastCall); + break; + default: + return Info; + } + + for (Function::const_arg_iterator AI = F->arg_begin(), + AE = F->arg_end(); + AI != AE; + ++AI) { + size += TD->getTypeSize(AI->getType()); + } + + // We're not supporting tooooo huge arguments :) + Info.setBytesToPopOnReturn((unsigned int)size); + + return Info; +} + + +// Query FunctionInfoMap and use this information for various name decoration +void X86SharedAsmPrinter::decorateName(std::string& Name, const GlobalValue* GV) +{ + const X86FunctionInfo* Info; + const Function* F; + + if ((F = dyn_cast<Function>(GV)) == NULL) { + return; + } + + unsigned CC = F->getCallingConv(); + + // We don't want to decorate non-stdcall or non-fastcall functions right now + if (CC != CallingConv::X86_StdCall && CC != CallingConv::X86_FastCall) { + return; + } + + FMFInfoMap::const_iterator info_item = FunctionInfoMap.find(F); + + if (info_item == FunctionInfoMap.end()) { + // Calculate apropriate function info and populate map + FunctionInfoMap[F] = calculateFunctionInfo(F, TM.getTargetData()); + Info = &FunctionInfoMap[F]; + } else { + Info = &(info_item->second); + } + + switch (Info->getDecorationStyle()) { + case None: + break; + case StdCall: + if (!F->isVarArg()) { + // Variadic functions do not receive @0 suffix + Name += '@' + utostr_32(Info->getBytesToPopOnReturn()); + } + break; + case FastCall: + if (!F->isVarArg()) { + // Variadic functions do not receive @0 suffix + Name += '@' + utostr_32(Info->getBytesToPopOnReturn()); + } + if (Name[0] == '_') { + Name[0] = '@'; + } else { + Name = '@' + Name; + } + break; + default: + assert(0 && "Unsupported DecorationStyle"); + } + +} + /// doInitialization bool X86SharedAsmPrinter::doInitialization(Module &M) { if (Subtarget->isTargetDarwin()) { |

