Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(128)

Side by Side Diff: src/IceInst.h

Issue 577353003: Add call instructions to Subzero's bitcode reader. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix remaining issues raised. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceConverter.cpp ('k') | src/IceInst.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceInst.h - High-level instructions ----------*- C++ -*-===// 1 //===- subzero/src/IceInst.h - High-level instructions ----------*- C++ -*-===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 // 9 //
10 // This file declares the Inst class and its target-independent 10 // This file declares the Inst class and its target-independent
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 289
290 CfgNode *const TargetFalse; // Doubles as unconditional branch target 290 CfgNode *const TargetFalse; // Doubles as unconditional branch target
291 CfgNode *const TargetTrue; // NULL if unconditional branch 291 CfgNode *const TargetTrue; // NULL if unconditional branch
292 }; 292 };
293 293
294 // Call instruction. The call target is captured as getSrc(0), and 294 // Call instruction. The call target is captured as getSrc(0), and
295 // arg I is captured as getSrc(I+1). 295 // arg I is captured as getSrc(I+1).
296 class InstCall : public Inst { 296 class InstCall : public Inst {
297 public: 297 public:
298 static InstCall *create(Cfg *Func, SizeT NumArgs, Variable *Dest, 298 static InstCall *create(Cfg *Func, SizeT NumArgs, Variable *Dest,
299 Operand *CallTarget) { 299 Operand *CallTarget, bool HasTailCall) {
300 // Set HasSideEffects to true so that the call instruction can't be 300 // Set HasSideEffects to true so that the call instruction can't be
301 // dead-code eliminated. IntrinsicCalls can override this if the 301 // dead-code eliminated. IntrinsicCalls can override this if the
302 // particular intrinsic is deletable and has no side-effects. 302 // particular intrinsic is deletable and has no side-effects.
303 const bool HasSideEffects = true; 303 const bool HasSideEffects = true;
304 const InstKind Kind = Inst::Call; 304 const InstKind Kind = Inst::Call;
305 return new (Func->allocateInst<InstCall>()) 305 return new (Func->allocateInst<InstCall>()) InstCall(
306 InstCall(Func, NumArgs, Dest, CallTarget, HasSideEffects, Kind); 306 Func, NumArgs, Dest, CallTarget, HasTailCall, HasSideEffects, Kind);
307 } 307 }
308 void addArg(Operand *Arg) { addSource(Arg); } 308 void addArg(Operand *Arg) { addSource(Arg); }
309 Operand *getCallTarget() const { return getSrc(0); } 309 Operand *getCallTarget() const { return getSrc(0); }
310 Operand *getArg(SizeT I) const { return getSrc(I + 1); } 310 Operand *getArg(SizeT I) const { return getSrc(I + 1); }
311 SizeT getNumArgs() const { return getSrcSize() - 1; } 311 SizeT getNumArgs() const { return getSrcSize() - 1; }
312 bool isTailcall() const { return HasTailCall; }
312 virtual void dump(const Cfg *Func) const; 313 virtual void dump(const Cfg *Func) const;
313 static bool classof(const Inst *Inst) { return Inst->getKind() == Call; } 314 static bool classof(const Inst *Inst) { return Inst->getKind() == Call; }
315 Type getReturnType() const;
314 316
315 protected: 317 protected:
316 InstCall(Cfg *Func, SizeT NumArgs, Variable *Dest, Operand *CallTarget, 318 InstCall(Cfg *Func, SizeT NumArgs, Variable *Dest, Operand *CallTarget,
317 bool HasSideEff, InstKind Kind) 319 bool HasTailCall, bool HasSideEff, InstKind Kind)
318 : Inst(Func, Kind, NumArgs + 1, Dest) { 320 : Inst(Func, Kind, NumArgs + 1, Dest),
321 HasTailCall(HasTailCall) {
319 HasSideEffects = HasSideEff; 322 HasSideEffects = HasSideEff;
320 addSource(CallTarget); 323 addSource(CallTarget);
321 } 324 }
322 virtual ~InstCall() {} 325 virtual ~InstCall() {}
323 326
324 private: 327 private:
328 bool HasTailCall;
325 InstCall(const InstCall &) LLVM_DELETED_FUNCTION; 329 InstCall(const InstCall &) LLVM_DELETED_FUNCTION;
326 InstCall &operator=(const InstCall &) LLVM_DELETED_FUNCTION; 330 InstCall &operator=(const InstCall &) LLVM_DELETED_FUNCTION;
327 }; 331 };
328 332
329 // Cast instruction (a.k.a. conversion operation). 333 // Cast instruction (a.k.a. conversion operation).
330 class InstCast : public Inst { 334 class InstCast : public Inst {
331 public: 335 public:
332 enum OpKind { 336 enum OpKind {
333 #define X(tag, str) tag, 337 #define X(tag, str) tag,
334 ICEINSTCAST_TABLE 338 ICEINSTCAST_TABLE
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 } 472 }
469 static bool classof(const Inst *Inst) { 473 static bool classof(const Inst *Inst) {
470 return Inst->getKind() == IntrinsicCall; 474 return Inst->getKind() == IntrinsicCall;
471 } 475 }
472 476
473 Intrinsics::IntrinsicInfo getIntrinsicInfo() const { return Info; } 477 Intrinsics::IntrinsicInfo getIntrinsicInfo() const { return Info; }
474 478
475 private: 479 private:
476 InstIntrinsicCall(Cfg *Func, SizeT NumArgs, Variable *Dest, 480 InstIntrinsicCall(Cfg *Func, SizeT NumArgs, Variable *Dest,
477 Operand *CallTarget, const Intrinsics::IntrinsicInfo &Info) 481 Operand *CallTarget, const Intrinsics::IntrinsicInfo &Info)
478 : InstCall(Func, NumArgs, Dest, CallTarget, Info.HasSideEffects, 482 : InstCall(Func, NumArgs, Dest, CallTarget, false, Info.HasSideEffects,
479 Inst::IntrinsicCall), 483 Inst::IntrinsicCall),
480 Info(Info) {} 484 Info(Info) {}
481 InstIntrinsicCall(const InstIntrinsicCall &) LLVM_DELETED_FUNCTION; 485 InstIntrinsicCall(const InstIntrinsicCall &) LLVM_DELETED_FUNCTION;
482 InstIntrinsicCall &operator=(const InstIntrinsicCall &) LLVM_DELETED_FUNCTION; 486 InstIntrinsicCall &operator=(const InstIntrinsicCall &) LLVM_DELETED_FUNCTION;
483 virtual ~InstIntrinsicCall() {} 487 virtual ~InstIntrinsicCall() {}
484 const Intrinsics::IntrinsicInfo Info; 488 const Intrinsics::IntrinsicInfo Info;
485 }; 489 };
486 490
487 // Load instruction. The source address is captured in getSrc(0). 491 // Load instruction. The source address is captured in getSrc(0).
488 class InstLoad : public Inst { 492 class InstLoad : public Inst {
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
762 assert(Kind >= Target); 766 assert(Kind >= Target);
763 } 767 }
764 InstTarget(const InstTarget &) LLVM_DELETED_FUNCTION; 768 InstTarget(const InstTarget &) LLVM_DELETED_FUNCTION;
765 InstTarget &operator=(const InstTarget &) LLVM_DELETED_FUNCTION; 769 InstTarget &operator=(const InstTarget &) LLVM_DELETED_FUNCTION;
766 virtual ~InstTarget() {} 770 virtual ~InstTarget() {}
767 }; 771 };
768 772
769 } // end of namespace Ice 773 } // end of namespace Ice
770 774
771 #endif // SUBZERO_SRC_ICEINST_H 775 #endif // SUBZERO_SRC_ICEINST_H
OLDNEW
« no previous file with comments | « src/IceConverter.cpp ('k') | src/IceInst.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698