• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- NaClBitcodeDecoders.cpp --------------------------------------------===//
2 //     Internal implementation of decoder functions for PNaCl Bitcode files.
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 
11 #include "llvm/Bitcode/NaCl/NaClBitcodeDecoders.h"
12 
13 namespace llvm {
14 namespace naclbitc {
15 
DecodeCastOpcode(uint64_t NaClOpcode,Instruction::CastOps & LLVMOpcode)16 bool DecodeCastOpcode(uint64_t NaClOpcode, Instruction::CastOps &LLVMOpcode) {
17   switch (NaClOpcode) {
18   default:
19     LLVMOpcode = Instruction::BitCast;
20     return false;
21   case naclbitc::CAST_TRUNC:
22     LLVMOpcode = Instruction::Trunc;
23     return true;
24   case naclbitc::CAST_ZEXT:
25     LLVMOpcode = Instruction::ZExt;
26     return true;
27   case naclbitc::CAST_SEXT:
28     LLVMOpcode = Instruction::SExt;
29     return true;
30   case naclbitc::CAST_FPTOUI:
31     LLVMOpcode = Instruction::FPToUI;
32     return true;
33   case naclbitc::CAST_FPTOSI:
34     LLVMOpcode = Instruction::FPToSI;
35     return true;
36   case naclbitc::CAST_UITOFP:
37     LLVMOpcode = Instruction::UIToFP;
38     return true;
39   case naclbitc::CAST_SITOFP:
40     LLVMOpcode = Instruction::SIToFP;
41     return true;
42   case naclbitc::CAST_FPTRUNC:
43     LLVMOpcode = Instruction::FPTrunc;
44     return true;
45   case naclbitc::CAST_FPEXT:
46     LLVMOpcode = Instruction::FPExt;
47     return true;
48   case naclbitc::CAST_BITCAST:
49     LLVMOpcode = Instruction::BitCast;
50     return true;
51   }
52 }
53 
DecodeLinkage(uint64_t NaClLinkage,GlobalValue::LinkageTypes & LLVMLinkage)54 bool DecodeLinkage(uint64_t NaClLinkage,
55                    GlobalValue::LinkageTypes &LLVMLinkage) {
56   switch (NaClLinkage) {
57   default:
58     LLVMLinkage = GlobalValue::InternalLinkage;
59     return false;
60   case naclbitc::LINKAGE_EXTERNAL:
61     LLVMLinkage = GlobalValue::ExternalLinkage;
62     return true;
63   case naclbitc::LINKAGE_INTERNAL:
64     LLVMLinkage = GlobalValue::InternalLinkage;
65     return true;
66   }
67 }
68 
DecodeBinaryOpcode(uint64_t NaClOpcode,Type * Ty,Instruction::BinaryOps & LLVMOpcode)69 bool DecodeBinaryOpcode(uint64_t NaClOpcode, Type *Ty,
70                         Instruction::BinaryOps &LLVMOpcode) {
71   switch (NaClOpcode) {
72   default:
73     LLVMOpcode = Instruction::Add;
74     return false;
75   case naclbitc::BINOP_ADD:
76     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FAdd : Instruction::Add;
77     return true;
78   case naclbitc::BINOP_SUB:
79     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FSub : Instruction::Sub;
80     return true;
81   case naclbitc::BINOP_MUL:
82     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FMul : Instruction::Mul;
83     return true;
84   case naclbitc::BINOP_UDIV:
85     LLVMOpcode = Instruction::UDiv;
86     return true;
87   case naclbitc::BINOP_SDIV:
88     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FDiv : Instruction::SDiv;
89     return true;
90   case naclbitc::BINOP_UREM:
91     LLVMOpcode = Instruction::URem;
92     return true;
93   case naclbitc::BINOP_SREM:
94     LLVMOpcode = Ty->isFPOrFPVectorTy() ? Instruction::FRem : Instruction::SRem;
95     return true;
96   case naclbitc::BINOP_SHL:
97     LLVMOpcode = Instruction::Shl;
98     return true;
99   case naclbitc::BINOP_LSHR:
100     LLVMOpcode = Instruction::LShr;
101     return true;
102   case naclbitc::BINOP_ASHR:
103     LLVMOpcode = Instruction::AShr;
104     return true;
105   case naclbitc::BINOP_AND:
106     LLVMOpcode = Instruction::And;
107     return true;
108   case naclbitc::BINOP_OR:
109     LLVMOpcode = Instruction::Or;
110     return true;
111   case naclbitc::BINOP_XOR:
112     LLVMOpcode = Instruction::Xor;
113     return true;
114   }
115 }
116 
DecodeCallingConv(uint64_t NaClCallingConv,CallingConv::ID & LLVMCallingConv)117 bool DecodeCallingConv(uint64_t NaClCallingConv,
118                        CallingConv::ID &LLVMCallingConv) {
119   switch (NaClCallingConv) {
120   default:
121     LLVMCallingConv = CallingConv::C;
122     return false;
123   case naclbitc::C_CallingConv:
124     LLVMCallingConv = CallingConv::C;
125     return true;
126   }
127 }
128 
DecodeFcmpPredicate(uint64_t NaClPredicate,CmpInst::Predicate & LLVMPredicate)129 bool DecodeFcmpPredicate(uint64_t NaClPredicate,
130                          CmpInst::Predicate &LLVMPredicate) {
131   switch (NaClPredicate) {
132   default:
133     LLVMPredicate = CmpInst::FCMP_FALSE;
134     return false;
135   case naclbitc::FCMP_FALSE:
136     LLVMPredicate = CmpInst::FCMP_FALSE;
137     return true;
138   case naclbitc::FCMP_OEQ:
139     LLVMPredicate = CmpInst::FCMP_OEQ;
140     return true;
141   case naclbitc::FCMP_OGT:
142     LLVMPredicate = CmpInst::FCMP_OGT;
143     return true;
144   case naclbitc::FCMP_OGE:
145     LLVMPredicate = CmpInst::FCMP_OGE;
146     return true;
147   case naclbitc::FCMP_OLT:
148     LLVMPredicate = CmpInst::FCMP_OLT;
149     return true;
150   case naclbitc::FCMP_OLE:
151     LLVMPredicate = CmpInst::FCMP_OLE;
152     return true;
153   case naclbitc::FCMP_ONE:
154     LLVMPredicate = CmpInst::FCMP_ONE;
155     return true;
156   case naclbitc::FCMP_ORD:
157     LLVMPredicate = CmpInst::FCMP_ORD;
158     return true;
159   case naclbitc::FCMP_UNO:
160     LLVMPredicate = CmpInst::FCMP_UNO;
161     return true;
162   case naclbitc::FCMP_UEQ:
163     LLVMPredicate = CmpInst::FCMP_UEQ;
164     return true;
165   case naclbitc::FCMP_UGT:
166     LLVMPredicate = CmpInst::FCMP_UGT;
167     return true;
168   case naclbitc::FCMP_UGE:
169     LLVMPredicate = CmpInst::FCMP_UGE;
170     return true;
171   case naclbitc::FCMP_ULT:
172     LLVMPredicate = CmpInst::FCMP_ULT;
173     return true;
174   case naclbitc::FCMP_ULE:
175     LLVMPredicate = CmpInst::FCMP_ULE;
176     return true;
177   case naclbitc::FCMP_UNE:
178     LLVMPredicate = CmpInst::FCMP_UNE;
179     return true;
180   case naclbitc::FCMP_TRUE:
181     LLVMPredicate = CmpInst::FCMP_TRUE;
182     return true;
183   }
184 }
185 
DecodeIcmpPredicate(uint64_t NaClPredicate,CmpInst::Predicate & LLVMPredicate)186 bool DecodeIcmpPredicate(uint64_t NaClPredicate,
187                          CmpInst::Predicate &LLVMPredicate) {
188   switch (NaClPredicate) {
189   default:
190     LLVMPredicate = CmpInst::ICMP_EQ;
191     return false;
192   case naclbitc::ICMP_EQ:
193     LLVMPredicate = CmpInst::ICMP_EQ;
194     return true;
195   case naclbitc::ICMP_NE:
196     LLVMPredicate = CmpInst::ICMP_NE;
197     return true;
198   case naclbitc::ICMP_UGT:
199     LLVMPredicate = CmpInst::ICMP_UGT;
200     return true;
201   case naclbitc::ICMP_UGE:
202     LLVMPredicate = CmpInst::ICMP_UGE;
203     return true;
204   case naclbitc::ICMP_ULT:
205     LLVMPredicate = CmpInst::ICMP_ULT;
206     return true;
207   case naclbitc::ICMP_ULE:
208     LLVMPredicate = CmpInst::ICMP_ULE;
209     return true;
210   case naclbitc::ICMP_SGT:
211     LLVMPredicate = CmpInst::ICMP_SGT;
212     return true;
213   case naclbitc::ICMP_SGE:
214     LLVMPredicate = CmpInst::ICMP_SGE;
215     return true;
216   case naclbitc::ICMP_SLT:
217     LLVMPredicate = CmpInst::ICMP_SLT;
218     return true;
219   case naclbitc::ICMP_SLE:
220     LLVMPredicate = CmpInst::ICMP_SLE;
221     return true;
222   }
223 }
224 
225 } // namespace naclbitc
226 } // namespace llvm
227