Index: pnacl-llvm/NaClBitcodeDecoders.cpp |
diff --git a/pnacl-llvm/NaClBitcodeDecoders.cpp b/pnacl-llvm/NaClBitcodeDecoders.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..450499a351910ff7c5892fd42be79f0ddd030383 |
--- /dev/null |
+++ b/pnacl-llvm/NaClBitcodeDecoders.cpp |
@@ -0,0 +1,228 @@ |
+//===- NaClBitcodeDecoders.cpp --------------------------------------------===// |
+// Internal implementation of decoder functions for PNaCl Bitcode files. |
+// |
+// The LLVM Compiler Infrastructure |
+// |
+// This file is distributed under the University of Illinois Open Source |
+// License. See LICENSE.TXT for details. |
+// |
+//===----------------------------------------------------------------------===// |
+ |
+#include "llvm/Bitcode/NaCl/NaClBitcodeDecoders.h" |
+ |
+namespace llvm { |
+namespace naclbitc { |
+ |
+bool DecodeCastOpcode(uint64_t NaClOpcode, |
+ Instruction::CastOps &LLVMOpcode) { |
+ switch (NaClOpcode) { |
+ default: |
+ LLVMOpcode = Instruction::BitCast; |
+ return false; |
+ case naclbitc::CAST_TRUNC: |
+ LLVMOpcode = Instruction::Trunc; |
+ return true; |
+ case naclbitc::CAST_ZEXT: |
+ LLVMOpcode = Instruction::ZExt; |
+ return true; |
+ case naclbitc::CAST_SEXT: |
+ LLVMOpcode = Instruction::SExt; |
+ return true; |
+ case naclbitc::CAST_FPTOUI: |
+ LLVMOpcode = Instruction::FPToUI; |
+ return true; |
+ case naclbitc::CAST_FPTOSI: |
+ LLVMOpcode = Instruction::FPToSI; |
+ return true; |
+ case naclbitc::CAST_UITOFP: |
+ LLVMOpcode = Instruction::UIToFP; |
+ return true; |
+ case naclbitc::CAST_SITOFP: |
+ LLVMOpcode = Instruction::SIToFP; |
+ return true; |
+ case naclbitc::CAST_FPTRUNC: |
+ LLVMOpcode = Instruction::FPTrunc; |
+ return true; |
+ case naclbitc::CAST_FPEXT: |
+ LLVMOpcode = Instruction::FPExt; |
+ return true; |
+ case naclbitc::CAST_BITCAST: |
+ LLVMOpcode = Instruction::BitCast; |
+ return true; |
+ } |
+} |
+ |
+bool DecodeLinkage(uint64_t NaClLinkage, |
+ GlobalValue::LinkageTypes &LLVMLinkage) { |
+ switch (NaClLinkage) { |
+ default: |
+ LLVMLinkage = GlobalValue::InternalLinkage; |
+ return false; |
+ case naclbitc::LINKAGE_EXTERNAL: |
+ LLVMLinkage = GlobalValue::ExternalLinkage; |
+ return true; |
+ case naclbitc::LINKAGE_INTERNAL: |
+ LLVMLinkage = GlobalValue::InternalLinkage; |
+ return true; |
+ } |
+} |
+ |
+bool DecodeBinaryOpcode(uint64_t NaClOpcode, Type *Ty, |
+ Instruction::BinaryOps &LLVMOpcode) { |
+ switch (NaClOpcode) { |
+ default: |
+ LLVMOpcode = Instruction::Add; |
+ return false; |
+ case naclbitc::BINOP_ADD: |
+ LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add; |
+ return true; |
+ case naclbitc::BINOP_SUB: |
+ LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub; |
+ return true; |
+ case naclbitc::BINOP_MUL: |
+ LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul; |
+ return true; |
+ case naclbitc::BINOP_UDIV: |
+ LLVMOpcode = Instruction::UDiv; |
+ return true; |
+ case naclbitc::BINOP_SDIV: |
+ LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv; |
+ return true; |
+ case naclbitc::BINOP_UREM: |
+ LLVMOpcode = Instruction::URem; |
+ return true; |
+ case naclbitc::BINOP_SREM: |
+ LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem; |
+ return true; |
+ case naclbitc::BINOP_SHL: |
+ LLVMOpcode = Instruction::Shl; |
+ return true; |
+ case naclbitc::BINOP_LSHR: |
+ LLVMOpcode = Instruction::LShr; |
+ return true; |
+ case naclbitc::BINOP_ASHR: |
+ LLVMOpcode = Instruction::AShr; |
+ return true; |
+ case naclbitc::BINOP_AND: |
+ LLVMOpcode = Instruction::And; |
+ return true; |
+ case naclbitc::BINOP_OR: |
+ LLVMOpcode = Instruction::Or; |
+ return true; |
+ case naclbitc::BINOP_XOR: |
+ LLVMOpcode = Instruction::Xor; |
+ return true; |
+ } |
+} |
+ |
+bool DecodeCallingConv(uint64_t NaClCallingConv, |
+ CallingConv::ID &LLVMCallingConv) { |
+ switch (NaClCallingConv) { |
+ default: |
+ LLVMCallingConv = CallingConv::C; |
+ return false; |
+ case naclbitc::C_CallingConv: |
+ LLVMCallingConv = CallingConv::C; |
+ return true; |
+ } |
+} |
+ |
+bool DecodeFcmpPredicate(uint64_t NaClPredicate, |
+ CmpInst::Predicate &LLVMPredicate) { |
+ switch (NaClPredicate) { |
+ default: |
+ LLVMPredicate = CmpInst::FCMP_FALSE; |
+ return false; |
+ case naclbitc::FCMP_FALSE: |
+ LLVMPredicate = CmpInst::FCMP_FALSE; |
+ return true; |
+ case naclbitc::FCMP_OEQ: |
+ LLVMPredicate = CmpInst::FCMP_OEQ; |
+ return true; |
+ case naclbitc::FCMP_OGT: |
+ LLVMPredicate = CmpInst::FCMP_OGT; |
+ return true; |
+ case naclbitc::FCMP_OGE: |
+ LLVMPredicate = CmpInst::FCMP_OGE; |
+ return true; |
+ case naclbitc::FCMP_OLT: |
+ LLVMPredicate = CmpInst::FCMP_OLT; |
+ return true; |
+ case naclbitc::FCMP_OLE: |
+ LLVMPredicate = CmpInst::FCMP_OLE; |
+ return true; |
+ case naclbitc::FCMP_ONE: |
+ LLVMPredicate = CmpInst::FCMP_ONE; |
+ return true; |
+ case naclbitc::FCMP_ORD: |
+ LLVMPredicate = CmpInst::FCMP_ORD; |
+ return true; |
+ case naclbitc::FCMP_UNO: |
+ LLVMPredicate = CmpInst::FCMP_UNO; |
+ return true; |
+ case naclbitc::FCMP_UEQ: |
+ LLVMPredicate = CmpInst::FCMP_UEQ; |
+ return true; |
+ case naclbitc::FCMP_UGT: |
+ LLVMPredicate = CmpInst::FCMP_UGT; |
+ return true; |
+ case naclbitc::FCMP_UGE: |
+ LLVMPredicate = CmpInst::FCMP_UGE; |
+ return true; |
+ case naclbitc::FCMP_ULT: |
+ LLVMPredicate = CmpInst::FCMP_ULT; |
+ return true; |
+ case naclbitc::FCMP_ULE: |
+ LLVMPredicate = CmpInst::FCMP_ULE; |
+ return true; |
+ case naclbitc::FCMP_UNE: |
+ LLVMPredicate = CmpInst::FCMP_UNE; |
+ return true; |
+ case naclbitc::FCMP_TRUE: |
+ LLVMPredicate = CmpInst::FCMP_TRUE; |
+ return true; |
+ } |
+} |
+ |
+bool DecodeIcmpPredicate(uint64_t NaClPredicate, |
+ CmpInst::Predicate &LLVMPredicate) { |
+ switch (NaClPredicate) { |
+ default: |
+ LLVMPredicate = CmpInst::ICMP_EQ; |
+ return false; |
+ case naclbitc::ICMP_EQ: |
+ LLVMPredicate = CmpInst::ICMP_EQ; |
+ return true; |
+ case naclbitc::ICMP_NE: |
+ LLVMPredicate = CmpInst::ICMP_NE; |
+ return true; |
+ case naclbitc::ICMP_UGT: |
+ LLVMPredicate = CmpInst::ICMP_UGT; |
+ return true; |
+ case naclbitc::ICMP_UGE: |
+ LLVMPredicate = CmpInst::ICMP_UGE; |
+ return true; |
+ case naclbitc::ICMP_ULT: |
+ LLVMPredicate = CmpInst::ICMP_ULT; |
+ return true; |
+ case naclbitc::ICMP_ULE: |
+ LLVMPredicate = CmpInst::ICMP_ULE; |
+ return true; |
+ case naclbitc::ICMP_SGT: |
+ LLVMPredicate = CmpInst::ICMP_SGT; |
+ return true; |
+ case naclbitc::ICMP_SGE: |
+ LLVMPredicate = CmpInst::ICMP_SGE; |
+ return true; |
+ case naclbitc::ICMP_SLT: |
+ LLVMPredicate = CmpInst::ICMP_SLT; |
+ return true; |
+ case naclbitc::ICMP_SLE: |
+ LLVMPredicate = CmpInst::ICMP_SLE; |
+ return true; |
+ } |
+} |
+ |
+ |
+} |
+} |