//===-- llvm/Target/TargetLibraryInfo.h - Library information ---*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_TARGET_TARGETLIBRARYINFO_H
#define LLVM_TARGET_TARGETLIBRARYINFO_H

#include "llvm/Pass.h"

namespace llvm {
  class Triple;

  namespace LibFunc {
    enum Func {
      /// void *memset(void *b, int c, size_t len);
      memset,
      
      // void *memcpy(void *s1, const void *s2, size_t n);
      memcpy,
      
      // void *memmove(void *s1, const void *s2, size_t n);
      memmove,
      
      /// void memset_pattern16(void *b, const void *pattern16, size_t len);
      memset_pattern16,
      
      /// int iprintf(const char *format, ...);
      iprintf,
      
      /// int siprintf(char *str, const char *format, ...);
      siprintf,
      
      /// int fiprintf(FILE *stream, const char *format, ...);
      fiprintf,
      
      NumLibFuncs
    };
  }

/// TargetLibraryInfo - This immutable pass captures information about what
/// library functions are available for the current target, and allows a
/// frontend to disable optimizations through -fno-builtin etc.
class TargetLibraryInfo : public ImmutablePass {
  unsigned char AvailableArray[(LibFunc::NumLibFuncs+7)/8];
public:
  static char ID;
  TargetLibraryInfo();
  TargetLibraryInfo(const Triple &T);
  explicit TargetLibraryInfo(const TargetLibraryInfo &TLI);
  
  /// has - This function is used by optimizations that want to match on or form
  /// a given library function.
  bool has(LibFunc::Func F) const {
    return (AvailableArray[F/8] & (1 << (F&7))) != 0;
  }

  /// setUnavailable - this can be used by whatever sets up TargetLibraryInfo to
  /// ban use of specific library functions.
  void setUnavailable(LibFunc::Func F) {
    AvailableArray[F/8] &= ~(1 << (F&7));
  }

  void setAvailable(LibFunc::Func F) {
    AvailableArray[F/8] |= 1 << (F&7);
  }
  
  /// disableAllFunctions - This disables all builtins, which is used for
  /// options like -fno-builtin.
  void disableAllFunctions();
};

} // end namespace llvm

#endif
