blob: 426d384ffadd5aacc40c349f2f72e23c3346cb2d [file] [log] [blame]
Shih-wei Liao462aefd2010-06-04 15:32:04 -07001#include "slang_rs_context.hpp"
2#include "slang_rs_export_func.hpp"
3#include "slang_rs_export_type.hpp"
4
5#include "clang/AST/Decl.h" /* for clang::*Decl */
6
7namespace slang {
8
9RSExportFunc* RSExportFunc::Create(RSContext* Context, const FunctionDecl* FD) {
10 llvm::StringRef Name = FD->getName();
11 RSExportFunc* F;
12
13 assert(!Name.empty() && "Function must have a name");
14
15 F = new RSExportFunc(Context, Name);
16
17 /* Check whether the parameters passed to the function is exportable */
18 for(int i=0;i<FD->getNumParams();i++) {
19 const ParmVarDecl* PVD = FD->getParamDecl(i);
20 const llvm::StringRef ParamName = PVD->getName();
21
22 assert(!ParamName.empty() && "Parameter must have a name");
23
24 if(PVD->hasDefaultArg())
25 printf("Note: parameter '%s' in function '%s' has default value will not support\n", ParamName.str().c_str(), Name.str().c_str());
26
27 /* Check type */
28 RSExportType* PET = RSExportType::CreateFromDecl(Context, PVD);
29 if(PET != NULL) {
30 F->mParams.push_back(new Parameter(PET, ParamName));
31 } else {
32 printf("Note: parameter '%s' in function '%s' uses unsupported type", ParamName.str().c_str(), Name.str().c_str());
33 delete F;
34 return NULL;
35 }
36 }
37
38 return F;
39}
40
41const RSExportRecordType* RSExportFunc::getParamPacketType() const {
42 /* Pack parameters */
43 if((mParamPacketType == NULL) && hasParam()) {
44 int Index = 0;
45 RSExportRecordType* ParamPacketType = new RSExportRecordType(mContext, "", false /* IsPacked */, true /* IsArtificial */);
46
47 for(const_param_iterator PI = params_begin();
48 PI != params_end();
49 PI++, Index++)
50 ParamPacketType->mFields.push_back( new RSExportRecordType::Field((*PI)->getType(), (*PI)->getName(), ParamPacketType, Index) );
51
52 mParamPacketType = ParamPacketType;
53 }
54
55 return mParamPacketType;
56}
57
58RSExportFunc::~RSExportFunc() {
59 for(const_param_iterator PI = params_begin();
60 PI != params_end();
61 PI++)
62 delete *PI;
63
64 if(mParamPacketType != NULL)
65 delete mParamPacketType;
66
67 return;
68}
69
70} /* namespace slang */