]> granicus.if.org Git - clang/commitdiff
Pass and return aggregate types directly to function calls.
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Tue, 21 Apr 2009 06:01:16 +0000 (06:01 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Tue, 21 Apr 2009 06:01:16 +0000 (06:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@69668 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp
lib/CodeGen/CGCall.cpp

index c392e58b48674849897a2c322a1a3b801c34f30c..3d549dc26172bfde3b1cd5df5b899b398aaad03d 100644 (file)
@@ -1184,7 +1184,7 @@ namespace {
                                    unsigned &NumRecords) const {}
     virtual const char *getVAListDeclaration() const { return "";}
     virtual const char *getClobbers() const {return "";}
-    virtual const char *getTargetPrefix() const {return "";}
+    virtual const char *getTargetPrefix() const {return "pic16";}
     virtual void getGCCRegNames(const char * const *&Names, 
                                 unsigned &NumNames) const {} 
     virtual bool validateAsmConstraint(const char *&Name, 
index d17ab134460c8d0cc5881a5fa2200449f5b177d8..5427466cdf9a2b3f59b5fc26a7282314bde2eb11 100644 (file)
@@ -1272,6 +1272,45 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
   return ResAddr;
 }
 
+// ABI Info for PIC16 
+class PIC16ABIInfo : public ABIInfo {
+  ABIArgInfo classifyReturnType(QualType RetTy, 
+                                ASTContext &Context) const;
+  
+  ABIArgInfo classifyArgumentType(QualType RetTy,
+                                  ASTContext &Context) const;
+
+  virtual void computeInfo(CGFunctionInfo &FI, ASTContext &Context) const {
+    FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context);
+    for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
+         it != ie; ++it)
+      it->info = classifyArgumentType(it->type, Context);
+  }
+
+  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
+                                 CodeGenFunction &CGF) const;
+
+};
+
+ABIArgInfo PIC16ABIInfo::classifyReturnType(QualType RetTy,
+                                              ASTContext &Context) const {
+  if (RetTy->isVoidType()) {
+    return ABIArgInfo::getIgnore();
+  } else {
+    return ABIArgInfo::getDirect();
+  }
+}
+
+ABIArgInfo PIC16ABIInfo::classifyArgumentType(QualType Ty,
+                                                ASTContext &Context) const {
+  return ABIArgInfo::getDirect();
+}
+
+llvm::Value *PIC16ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
+                                       CodeGenFunction &CGF) const {
+  return 0;
+}
+
 class ARMABIInfo : public ABIInfo {
   ABIArgInfo classifyReturnType(QualType RetTy, 
                                 ASTContext &Context) const;
@@ -1400,6 +1439,8 @@ const ABIInfo &CodeGenTypes::getABIInfo() const {
   } else if (strcmp(TargetPrefix, "arm") == 0) {
     // FIXME: Support for OABI?
     return *(TheABIInfo = new ARMABIInfo());
+  } else if (strcmp(TargetPrefix, "pic16") == 0) {
+    return *(TheABIInfo = new PIC16ABIInfo());
   }
 
   return *(TheABIInfo = new DefaultABIInfo);