parent
							
								
									0ef3479cb7
								
							
						
					
					
						commit
						d59655c992
					
				| 
						 | 
					@ -1107,6 +1107,8 @@ static llvm::Value *EmitVAArgFromMemory(llvm::Value *VAListAddr,
 | 
				
			||||||
llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
					llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
                                      CodeGenFunction &CGF) const {
 | 
					                                      CodeGenFunction &CGF) const {
 | 
				
			||||||
  llvm::LLVMContext &VMContext = CGF.getLLVMContext();
 | 
					  llvm::LLVMContext &VMContext = CGF.getLLVMContext();
 | 
				
			||||||
 | 
					  const llvm::Type *i32Ty = llvm::Type::getInt32Ty(VMContext);
 | 
				
			||||||
 | 
					  const llvm::Type *DoubleTy = llvm::Type::getDoubleTy(VMContext);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Assume that va_list type is correct; should be pointer to LLVM type:
 | 
					  // Assume that va_list type is correct; should be pointer to LLVM type:
 | 
				
			||||||
  // struct {
 | 
					  // struct {
 | 
				
			||||||
| 
						 | 
					@ -1143,7 +1145,7 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
    gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
 | 
					    gp_offset = CGF.Builder.CreateLoad(gp_offset_p, "gp_offset");
 | 
				
			||||||
    InRegs =
 | 
					    InRegs =
 | 
				
			||||||
      CGF.Builder.CreateICmpULE(gp_offset,
 | 
					      CGF.Builder.CreateICmpULE(gp_offset,
 | 
				
			||||||
                                llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
 | 
					                                llvm::ConstantInt::get(i32Ty,
 | 
				
			||||||
                                                       48 - neededInt * 8),
 | 
					                                                       48 - neededInt * 8),
 | 
				
			||||||
                                "fits_in_gp");
 | 
					                                "fits_in_gp");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -1153,7 +1155,7 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
    fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
 | 
					    fp_offset = CGF.Builder.CreateLoad(fp_offset_p, "fp_offset");
 | 
				
			||||||
    llvm::Value *FitsInFP =
 | 
					    llvm::Value *FitsInFP =
 | 
				
			||||||
      CGF.Builder.CreateICmpULE(fp_offset,
 | 
					      CGF.Builder.CreateICmpULE(fp_offset,
 | 
				
			||||||
                                llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
 | 
					                                llvm::ConstantInt::get(i32Ty,
 | 
				
			||||||
                                                       176 - neededSSE * 16),
 | 
					                                                       176 - neededSSE * 16),
 | 
				
			||||||
                                "fits_in_fp");
 | 
					                                "fits_in_fp");
 | 
				
			||||||
    InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
 | 
					    InRegs = InRegs ? CGF.Builder.CreateAnd(InRegs, FitsInFP) : FitsInFP;
 | 
				
			||||||
| 
						 | 
					@ -1222,13 +1224,11 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
      llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset);
 | 
					      llvm::Value *RegAddrLo = CGF.Builder.CreateGEP(RegAddr, fp_offset);
 | 
				
			||||||
      llvm::Value *RegAddrHi =
 | 
					      llvm::Value *RegAddrHi =
 | 
				
			||||||
        CGF.Builder.CreateGEP(RegAddrLo,
 | 
					        CGF.Builder.CreateGEP(RegAddrLo,
 | 
				
			||||||
                            llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 16));
 | 
					                            llvm::ConstantInt::get(i32Ty, 16));
 | 
				
			||||||
      const llvm::Type *DblPtrTy =
 | 
					      const llvm::Type *DblPtrTy =
 | 
				
			||||||
        llvm::PointerType::getUnqual(llvm::Type::getDoubleTy(VMContext));
 | 
					        llvm::PointerType::getUnqual(DoubleTy);
 | 
				
			||||||
      const llvm::StructType *ST = llvm::StructType::get(VMContext,
 | 
					      const llvm::StructType *ST = llvm::StructType::get(VMContext, DoubleTy,
 | 
				
			||||||
                                                         llvm::Type::getDoubleTy(VMContext),
 | 
					                                                         DoubleTy, NULL);
 | 
				
			||||||
                                                         llvm::Type::getDoubleTy(VMContext),
 | 
					 | 
				
			||||||
                                                         NULL);
 | 
					 | 
				
			||||||
      llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST);
 | 
					      llvm::Value *V, *Tmp = CGF.CreateTempAlloca(ST);
 | 
				
			||||||
      V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo,
 | 
					      V = CGF.Builder.CreateLoad(CGF.Builder.CreateBitCast(RegAddrLo,
 | 
				
			||||||
                                                           DblPtrTy));
 | 
					                                                           DblPtrTy));
 | 
				
			||||||
| 
						 | 
					@ -1245,14 +1245,12 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
  // l->gp_offset = l->gp_offset + num_gp * 8
 | 
					  // l->gp_offset = l->gp_offset + num_gp * 8
 | 
				
			||||||
  // l->fp_offset = l->fp_offset + num_fp * 16.
 | 
					  // l->fp_offset = l->fp_offset + num_fp * 16.
 | 
				
			||||||
  if (neededInt) {
 | 
					  if (neededInt) {
 | 
				
			||||||
    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
 | 
					    llvm::Value *Offset = llvm::ConstantInt::get(i32Ty, neededInt * 8);
 | 
				
			||||||
                                                 neededInt * 8);
 | 
					 | 
				
			||||||
    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
 | 
					    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(gp_offset, Offset),
 | 
				
			||||||
                            gp_offset_p);
 | 
					                            gp_offset_p);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  if (neededSSE) {
 | 
					  if (neededSSE) {
 | 
				
			||||||
    llvm::Value *Offset = llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext),
 | 
					    llvm::Value *Offset = llvm::ConstantInt::get(i32Ty, neededSSE * 16);
 | 
				
			||||||
                                                 neededSSE * 16);
 | 
					 | 
				
			||||||
    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
 | 
					    CGF.Builder.CreateStore(CGF.Builder.CreateAdd(fp_offset, Offset),
 | 
				
			||||||
                            fp_offset_p);
 | 
					                            fp_offset_p);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -1275,7 +1273,10 @@ llvm::Value *X86_64ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
  return ResAddr;
 | 
					  return ResAddr;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ABI Info for PIC16
 | 
					// PIC16 ABI Implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PIC16ABIInfo : public ABIInfo {
 | 
					class PIC16ABIInfo : public ABIInfo {
 | 
				
			||||||
  ABIArgInfo classifyReturnType(QualType RetTy,
 | 
					  ABIArgInfo classifyReturnType(QualType RetTy,
 | 
				
			||||||
                                ASTContext &Context,
 | 
					                                ASTContext &Context,
 | 
				
			||||||
| 
						 | 
					@ -1296,9 +1297,10 @@ class PIC16ABIInfo : public ABIInfo {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
					  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
                                 CodeGenFunction &CGF) const;
 | 
					                                 CodeGenFunction &CGF) const;
 | 
				
			||||||
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ABIArgInfo PIC16ABIInfo::classifyReturnType(QualType RetTy,
 | 
					ABIArgInfo PIC16ABIInfo::classifyReturnType(QualType RetTy,
 | 
				
			||||||
                                            ASTContext &Context,
 | 
					                                            ASTContext &Context,
 | 
				
			||||||
                                          llvm::LLVMContext &VMContext) const {
 | 
					                                          llvm::LLVMContext &VMContext) const {
 | 
				
			||||||
| 
						 | 
					@ -1320,6 +1322,10 @@ llvm::Value *PIC16ABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ARM ABI Implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ARMABIInfo : public ABIInfo {
 | 
					class ARMABIInfo : public ABIInfo {
 | 
				
			||||||
  ABIArgInfo classifyReturnType(QualType RetTy,
 | 
					  ABIArgInfo classifyReturnType(QualType RetTy,
 | 
				
			||||||
                                ASTContext &Context,
 | 
					                                ASTContext &Context,
 | 
				
			||||||
| 
						 | 
					@ -1336,6 +1342,8 @@ class ARMABIInfo : public ABIInfo {
 | 
				
			||||||
                                 CodeGenFunction &CGF) const;
 | 
					                                 CodeGenFunction &CGF) const;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ARMABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context,
 | 
					void ARMABIInfo::computeInfo(CGFunctionInfo &FI, ASTContext &Context,
 | 
				
			||||||
                             llvm::LLVMContext &VMContext) const {
 | 
					                             llvm::LLVMContext &VMContext) const {
 | 
				
			||||||
  FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context,
 | 
					  FI.getReturnInfo() = classifyReturnType(FI.getReturnType(), Context,
 | 
				
			||||||
| 
						 | 
					@ -1428,7 +1436,10 @@ ABIArgInfo DefaultABIInfo::classifyReturnType(QualType RetTy,
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SystemZ ABI Implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace {
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SystemZABIInfo : public ABIInfo {
 | 
					class SystemZABIInfo : public ABIInfo {
 | 
				
			||||||
  bool isPromotableIntegerType(QualType Ty) const;
 | 
					  bool isPromotableIntegerType(QualType Ty) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1450,6 +1461,7 @@ class SystemZABIInfo : public ABIInfo {
 | 
				
			||||||
  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
					  virtual llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
                                 CodeGenFunction &CGF) const;
 | 
					                                 CodeGenFunction &CGF) const;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool SystemZABIInfo::isPromotableIntegerType(QualType Ty) const {
 | 
					bool SystemZABIInfo::isPromotableIntegerType(QualType Ty) const {
 | 
				
			||||||
| 
						 | 
					@ -1481,7 +1493,7 @@ llvm::Value *SystemZABIInfo::EmitVAArg(llvm::Value *VAListAddr, QualType Ty,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ABIArgInfo SystemZABIInfo::classifyReturnType(QualType RetTy,
 | 
					ABIArgInfo SystemZABIInfo::classifyReturnType(QualType RetTy,
 | 
				
			||||||
                                              ASTContext &Context,
 | 
					                                              ASTContext &Context,
 | 
				
			||||||
                                            llvm::LLVMContext &VMContext) const {
 | 
					                                           llvm::LLVMContext &VMContext) const {
 | 
				
			||||||
  if (RetTy->isVoidType()) {
 | 
					  if (RetTy->isVoidType()) {
 | 
				
			||||||
    return ABIArgInfo::getIgnore();
 | 
					    return ABIArgInfo::getIgnore();
 | 
				
			||||||
  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
 | 
					  } else if (CodeGenFunction::hasAggregateLLVMType(RetTy)) {
 | 
				
			||||||
| 
						 | 
					@ -1494,7 +1506,7 @@ ABIArgInfo SystemZABIInfo::classifyReturnType(QualType RetTy,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ABIArgInfo SystemZABIInfo::classifyArgumentType(QualType Ty,
 | 
					ABIArgInfo SystemZABIInfo::classifyArgumentType(QualType Ty,
 | 
				
			||||||
                                                ASTContext &Context,
 | 
					                                                ASTContext &Context,
 | 
				
			||||||
                                            llvm::LLVMContext &VMContext) const {
 | 
					                                           llvm::LLVMContext &VMContext) const {
 | 
				
			||||||
  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
 | 
					  if (CodeGenFunction::hasAggregateLLVMType(Ty)) {
 | 
				
			||||||
    return ABIArgInfo::getIndirect(0);
 | 
					    return ABIArgInfo::getIndirect(0);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
| 
						 | 
					@ -1530,6 +1542,17 @@ const ABIInfo &CodeGenTypes::getABIInfo() const {
 | 
				
			||||||
  default:
 | 
					  default:
 | 
				
			||||||
    return *(TheABIInfo = new DefaultABIInfo);
 | 
					    return *(TheABIInfo = new DefaultABIInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  case llvm::Triple::arm:
 | 
				
			||||||
 | 
					  case llvm::Triple::thumb:
 | 
				
			||||||
 | 
					    // FIXME: Support for OABI?
 | 
				
			||||||
 | 
					    return *(TheABIInfo = new ARMABIInfo());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  case llvm::Triple::pic16:
 | 
				
			||||||
 | 
					    return *(TheABIInfo = new PIC16ABIInfo());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  case llvm::Triple::systemz:
 | 
				
			||||||
 | 
					    return *(TheABIInfo = new SystemZABIInfo());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  case llvm::Triple::x86:
 | 
					  case llvm::Triple::x86:
 | 
				
			||||||
    if (Triple.getOS() == llvm::Triple::Darwin)
 | 
					    if (Triple.getOS() == llvm::Triple::Darwin)
 | 
				
			||||||
      return *(TheABIInfo = new X86_32ABIInfo(Context, true, true));
 | 
					      return *(TheABIInfo = new X86_32ABIInfo(Context, true, true));
 | 
				
			||||||
| 
						 | 
					@ -1549,16 +1572,5 @@ const ABIInfo &CodeGenTypes::getABIInfo() const {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  case llvm::Triple::x86_64:
 | 
					  case llvm::Triple::x86_64:
 | 
				
			||||||
    return *(TheABIInfo = new X86_64ABIInfo());
 | 
					    return *(TheABIInfo = new X86_64ABIInfo());
 | 
				
			||||||
 | 
					 | 
				
			||||||
  case llvm::Triple::arm:
 | 
					 | 
				
			||||||
  case llvm::Triple::thumb:
 | 
					 | 
				
			||||||
    // FIXME: Support for OABI?
 | 
					 | 
				
			||||||
    return *(TheABIInfo = new ARMABIInfo());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  case llvm::Triple::pic16:
 | 
					 | 
				
			||||||
    return *(TheABIInfo = new PIC16ABIInfo());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  case llvm::Triple::systemz:
 | 
					 | 
				
			||||||
    return *(TheABIInfo = new SystemZABIInfo());
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue