aboutsummaryrefslogtreecommitdiffstats
path: root/ortho/llvm/ortho_llvm-main.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2014-03-06 21:27:19 +0100
committerTristan Gingold <tgingold@free.fr>2014-03-06 21:27:19 +0100
commit7b1e07c025bd01aad47bb78222a5e6b17682d4e4 (patch)
tree9bab215376b6cd0c0df0817d46f0bd12b880bc42 /ortho/llvm/ortho_llvm-main.adb
parent627f7b8313148cde9c372aca8b6cdc3d4d3dc78f (diff)
downloadghdl-7b1e07c025bd01aad47bb78222a5e6b17682d4e4.tar.gz
ghdl-7b1e07c025bd01aad47bb78222a5e6b17682d4e4.tar.bz2
ghdl-7b1e07c025bd01aad47bb78222a5e6b17682d4e4.zip
Add LLVM back-end for ortho.
Diffstat (limited to 'ortho/llvm/ortho_llvm-main.adb')
-rw-r--r--ortho/llvm/ortho_llvm-main.adb77
1 files changed, 77 insertions, 0 deletions
diff --git a/ortho/llvm/ortho_llvm-main.adb b/ortho/llvm/ortho_llvm-main.adb
new file mode 100644
index 000000000..f315fe44f
--- /dev/null
+++ b/ortho/llvm/ortho_llvm-main.adb
@@ -0,0 +1,77 @@
+-- LLVM back-end for ortho.
+-- Copyright (C) 2014 Tristan Gingold
+--
+-- GHDL 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.
+--
+-- GHDL 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.
+
+with Ada.Unchecked_Conversion;
+
+package body Ortho_LLVM.Main is
+ Dbg_Str : constant String := "dbg";
+
+ function To_String (C : Cstring) return String is
+ function Strlen (C : Cstring) return Natural;
+ pragma Import (C, Strlen);
+
+ subtype Fat_String is String (Positive);
+ type Fat_String_Acc is access Fat_String;
+
+ function To_Fat_String_Acc is new
+ Ada.Unchecked_Conversion (Cstring, Fat_String_Acc);
+ begin
+ return To_Fat_String_Acc (C)(1 .. Strlen (C));
+ end To_String;
+
+ procedure Init is
+ begin
+ Builder := CreateBuilder;
+ Decl_Builder := CreateBuilder;
+
+ Char_Type := New_Unsigned_Type (8);
+ New_Type_Decl (Get_Identifier ("__llvm_char"), Char_Type);
+
+ if False then
+ Char_Ptr_Type := New_Access_Type (Char_Type);
+ New_Type_Decl (Get_Identifier ("__llvm_char_ptr"), Char_Ptr_Type);
+
+ Stacksave_Fun := AddFunction
+ (Module, Stacksave_Name'Address,
+ FunctionType (Get_LLVM_Type (Char_Ptr_Type),
+ TypeRefArray'(1 .. 0 => Null_TypeRef), 0, 0));
+
+ Stackrestore_Fun := AddFunction
+ (Module, Stackrestore_Name'Address,
+ FunctionType
+ (VoidType,
+ TypeRefArray'(1 => Get_LLVM_Type (Char_Ptr_Type)), 1, 0));
+ end if;
+
+ if Flag_Debug then
+ Debug_ID := GetMDKindID (Dbg_Str, Dbg_Str'Length);
+
+ declare
+ Atypes : TypeRefArray (1 .. 2);
+ Ftype : TypeRef;
+ Name : String := "llvm.dbg.declare" & ASCII.NUL;
+ begin
+ Atypes := (MetadataType, MetadataType);
+ Ftype := FunctionType (VoidType, Atypes, Atypes'Length, 0);
+ Llvm_Dbg_Declare := AddFunction (Module, Name'Address, Ftype);
+ AddFunctionAttr (Llvm_Dbg_Declare,
+ NoUnwindAttribute + ReadNoneAttribute);
+ end;
+ end if;
+ end Init;
+end Ortho_LLVM.Main;