190a62c8d4b361406115bf7ff61ca7ab635c58349Chris Lattner//===-- IntrinsicLowering.h - Intrinsic Function Lowering -------*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 33f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner// The LLVM Compiler Infrastructure 43f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 83f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner//===----------------------------------------------------------------------===// 9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 103f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner// This file defines the IntrinsicLowering interface. This interface allows 113f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner// addition of domain-specific or front-end specific intrinsics to LLVM without 12b71fd7897f6b4500cdbe602c5a9907316750cf5aChris Lattner// having to modify all of the C backend or interpreter. 133f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner// 143f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner//===----------------------------------------------------------------------===// 153f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner 1690a62c8d4b361406115bf7ff61ca7ab635c58349Chris Lattner#ifndef LLVM_CODEGEN_INTRINSICLOWERING_H 1790a62c8d4b361406115bf7ff61ca7ab635c58349Chris Lattner#define LLVM_CODEGEN_INTRINSICLOWERING_H 183f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner 19f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner#include "llvm/Intrinsics.h" 20f70e0c216c074bd2ae2b08178f5512849545db4eChris Lattner 213f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattnernamespace llvm { 223f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner class CallInst; 2343c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner class Module; 2436abe148630ea3742a914d87bd6a54be7d8eb825Reid Spencer class TargetData; 25ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 26148d2065e4eb60357014a39c8e0d66c908679ffdAlkis Evlogimenos class IntrinsicLowering { 2736abe148630ea3742a914d87bd6a54be7d8eb825Reid Spencer const TargetData& TD; 28b41b5e0b2d865f9dcb8cc868b28929daf3a11207Owen Anderson 296279cd85e9e59c93d43877bf2cf7d116e51ce021Owen Anderson 306279cd85e9e59c93d43877bf2cf7d116e51ce021Owen Anderson bool Warned; 31148d2065e4eb60357014a39c8e0d66c908679ffdAlkis Evlogimenos public: 326279cd85e9e59c93d43877bf2cf7d116e51ce021Owen Anderson explicit IntrinsicLowering(const TargetData &td) : 33b41b5e0b2d865f9dcb8cc868b28929daf3a11207Owen Anderson TD(td), Warned(false) {} 343f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner 3543c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner /// AddPrototypes - This method, if called, causes all of the prototypes 3643c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner /// that might be needed by an intrinsic lowering implementation to be 3743c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner /// inserted into the module specified. 38b71fd7897f6b4500cdbe602c5a9907316750cf5aChris Lattner void AddPrototypes(Module &M); 3943c81f19ee791760ac2079886e76dfdfed58dc72Chris Lattner 40e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer /// LowerIntrinsicCall - This method replaces a call with the LLVM function 41e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer /// which should be used to implement the specified intrinsic function call. 42e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer /// If an intrinsic function must be implemented by the code generator 43e5da2c075e5b15b424d1e763e1bfac35f6470432Reid Spencer /// (such as va_start), this function should print a message and abort. 443f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner /// 453f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner /// Otherwise, if an intrinsic function call can be lowered, the code to 463f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner /// implement it (often a call to a non-intrinsic function) is inserted 473f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner /// _after_ the call instruction and the call is deleted. The caller must 483f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner /// be capable of handling this kind of change. 493f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner /// 50b71fd7897f6b4500cdbe602c5a9907316750cf5aChris Lattner void LowerIntrinsicCall(CallInst *CI); 5155d42003368c57d3a41c5f464d39b8440050d558Evan Cheng 5255d42003368c57d3a41c5f464d39b8440050d558Evan Cheng /// LowerToByteSwap - Replace a call instruction into a call to bswap 5355d42003368c57d3a41c5f464d39b8440050d558Evan Cheng /// intrinsic. Return false if it has determined the call is not a 5455d42003368c57d3a41c5f464d39b8440050d558Evan Cheng /// simple integer bswap. 5555d42003368c57d3a41c5f464d39b8440050d558Evan Cheng static bool LowerToByteSwap(CallInst *CI); 563f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner }; 573f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner} 583f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner 593f52c1561d70575b0003404e2c2210d6286f79a9Chris Lattner#endif 60