1//===-- IntrinsicLowering.h - Intrinsic Function Lowering -------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the IntrinsicLowering interface.  This interface allows
11// addition of domain-specific or front-end specific intrinsics to LLVM without
12// having to modify all of the C backend or interpreter.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CODEGEN_INTRINSICLOWERING_H
17#define LLVM_CODEGEN_INTRINSICLOWERING_H
18
19#include "llvm/IR/Intrinsics.h"
20
21namespace llvm {
22  class CallInst;
23  class Module;
24  class DataLayout;
25
26  class IntrinsicLowering {
27    const DataLayout& DL;
28
29
30    bool Warned;
31  public:
32    explicit IntrinsicLowering(const DataLayout &DL) :
33      DL(DL), Warned(false) {}
34
35    /// AddPrototypes - This method, if called, causes all of the prototypes
36    /// that might be needed by an intrinsic lowering implementation to be
37    /// inserted into the module specified.
38    void AddPrototypes(Module &M);
39
40    /// LowerIntrinsicCall - This method replaces a call with the LLVM function
41    /// which should be used to implement the specified intrinsic function call.
42    /// If an intrinsic function must be implemented by the code generator
43    /// (such as va_start), this function should print a message and abort.
44    ///
45    /// Otherwise, if an intrinsic function call can be lowered, the code to
46    /// implement it (often a call to a non-intrinsic function) is inserted
47    /// _after_ the call instruction and the call is deleted.  The caller must
48    /// be capable of handling this kind of change.
49    ///
50    void LowerIntrinsicCall(CallInst *CI);
51
52    /// LowerToByteSwap - Replace a call instruction into a call to bswap
53    /// intrinsic. Return false if it has determined the call is not a
54    /// simple integer bswap.
55    static bool LowerToByteSwap(CallInst *CI);
56  };
57}
58
59#endif
60