/* APPLE LOCAL begin LLVM (ENTIRE FILE!)  */
/* LLVM interface to GCC
   Copyright (C) 2005 Free Software Foundation, Inc.
   Contributed by Chris Lattner (sabre@nondot.org)

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING.  If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.  */

/* This file defines the public C interfaces to the LLVM backend. */
#ifndef LLVM_H
#define LLVM_H

/* This file is a noop unless GCC is configured with --enable-llvm. */
#ifdef ENABLE_LLVM

#include <stdio.h>
union tree_node;

/*
 *   Code defined in llvm-backend.cpp
 */
void llvm_initialize_backend(void);
void llvm_lang_dependent_init(const char *Name);

/* emit_llvm_code_for_current_function - Top level interface for emitting a
 * function to the .s file.
 */
void llvm_emit_code_for_current_function(union tree_node* fndecl);

/* make_decl_llvm - This is also defined in tree.h and used by macros there. */
void make_decl_llvm(union tree_node*);

/* emit_global_to_llvm - Emit the specified VAR_DECL to LLVM as a global
 * variable.
 */
void emit_global_to_llvm(union tree_node*);

/* emit_global_to_llvm - Emit the specified alias to LLVM
 */
void emit_alias_to_llvm(union tree_node*, union tree_node*, union tree_node*);

/* llvm_get_decl_name - Used by varasm.c, returns the specified declaration's
 * name.
 */
const char *llvm_get_decl_name(void *LLVM);

/* llvm_mark_decl_weak - Used by varasm.c, called when a decl is found to be
 * weak, but it already had an llvm object created for it.  This marks the LLVM
 * object weak as well.
 */
void llvm_mark_decl_weak(union tree_node*);

/* llvm_emit_ctor_dtor - Called to emit static ctors/dtors to LLVM code.  fndecl
 * is a 'void()' FUNCTION_DECL for the code, initprio is the init priority, and
 * isInit indicates whether this is a ctor or dtor.
 */
void llvm_emit_ctor_dtor(union tree_node* fndecl, int initprio, int isInit);

/* llvm_emit_file_scope_asm - Emit the specified string as a file-scope inline
 * asm block.
 */
void llvm_emit_file_scope_asm(union tree_node*);

/* llvm_emit_typedef - Emit the specified TYPE_DECL if desired.
 */
void llvm_emit_typedef(union tree_node*);

/* print_llvm - Print the specified LLVM chunk like an operand, called by
 * print-tree.c for tree dumps.
 */
void print_llvm(FILE *file, void *LLVM);

/* print_llvm_type - Print the specified LLVM type symbolically, called by
 * print-tree.c for tree dumps.
 */
void print_llvm_type(FILE *file, void *LLVM);

/* Init pch writing. */
void llvm_pch_write_init(void);

/* Read bytecodes from PCH file.  */
void llvm_pch_read(const unsigned char *, unsigned);

/* llvm_asm_file_start - Start the .s file. */
void llvm_asm_file_start(void);

/* llvm_asm_file_end - Finish the .s file. */
void llvm_asm_file_end(void);

#endif /* ENABLE_LLVM */

#endif
/* APPLE LOCAL end LLVM (ENTIRE FILE!)  */
