logo       
Google Custom Search
    AddThis Social Bookmark Button

r9805 - branches/llvm-backend: msg#00008

Subject: r9805 - branches/llvm-backend
Author: gabor
Date: Mon Mar  7 23:41:33 2005
New Revision: 9805

Modified:
   branches/llvm-backend/cback.dylan
   branches/llvm-backend/llvm-glue.cc
Log:
job: 7241
an attempt at GetElementPtr glue (on C++ side).
cleanups.


Modified: branches/llvm-backend/cback.dylan
==============================================================================
--- branches/llvm-backend/cback.dylan   (original)
+++ branches/llvm-backend/cback.dylan   Mon Mar  7 23:41:33 2005
@@ -138,6 +138,7 @@
    { <llvm-module> } => { "Module" }
    { <llvm-function> } => { "Function" }
    { <llvm-argument> } => { "Argument" }
+   { <llvm-add-instruction> } => { "BinaryAdd" }
 end;
 
 
@@ -204,6 +205,24 @@
 
 
 
+define functional class <llvm-binary-instruction>(<llvm-instruction>)
+
+end;
+
+define functional class <llvm-add-instruction>(<llvm-binary-instruction>)
+
+end;
+
+define llvm-glue <llvm-add-instruction> ()
+  make, (left :: <llvm-value>, right :: <llvm-value>,
+        name :: <byte-string> = "",
+        before :: false-or(<llvm-instruction>),
+        atEnd :: false-or(<llvm-basic-block>)), ptr: left.raw-value,
+                                                ptr: right.raw-value,
+                                                ptr: name.object-address,
+                                                ptr: (atEnd | 
$null-pointer).raw-value,
+                                                ptr: (before | 
$null-pointer).raw-value;
+end;
 
 
 // ################
@@ -217,16 +236,6 @@
   virtual slot terminator :: <llvm-instruction>;
 end;
 
-/*
-define method make (c == <llvm-basic-block>, #rest rest,
-                   #key name :: <byte-string> = "",
-                        into :: false-or(<llvm-function>),
-                        before :: false-or(<llvm-basic-block>))
- => (result :: <llvm-basic-block>);
-  next-method(c, pointer: call-out("make_llvm_BasicBlock", ptr:, ptr: 
name.object-address, ptr: raw-value(into | $null-pointer), ptr: 
raw-value(before | $null-pointer)));
-end;
-*/
-
 define llvm-glue <llvm-basic-block> ()
   make, (name :: <byte-string> = "",
         into :: false-or(<llvm-function>),
@@ -243,16 +252,6 @@
   virtual slot next :: <llvm-function>;
 end;
 
-/*
-define method make (f == <llvm-function>, #rest rest, #key type :: 
<llvm-function-type>, name :: <byte-string> = "", module :: 
false-or(<llvm-module>))
- => (result :: <llvm-function>);
-  next-method(f, pointer: call-out("make_llvm_Function", ptr:,
-                                  ptr: type.raw-value,
-                                  ptr: name.object-address,
-                                  ptr: raw-value(module | $null-pointer)));
-end;
-*/
-
 define llvm-glue <llvm-function> ()
   make, (type :: <llvm-function-type>,
         name :: <byte-string> = "",
@@ -292,13 +291,6 @@
 */
 end;
 
-/*
-define method make (m == <llvm-module>, #rest rest, #key name :: <byte-string> 
= "")
- => (result :: <llvm-module>);
-  next-method(m, pointer: call-out("make_llvm_Module", ptr:, ptr: 
name.object-address));
-end;
-*/
-
 define llvm-glue <llvm-module> ()
   delete, () => ();
   dump, () => ();
@@ -328,10 +320,12 @@
   func.dump;
   
   let f = make(<llvm-function>, name: "main", type: func, module: m);
-  make(<llvm-argument>, type: inttype, name: "foo", func: f);
+  let arg = make(<llvm-argument>, type: inttype, name: "foo", func: f);
 
   let bb = make(<llvm-basic-block>, name: "body", into: f);
-  make(<llvm-return-instruction>, atEnd: bb);
+  let retu = make(<llvm-return-instruction>, atEnd: bb);
+  
+  make(<llvm-add-instruction>, left: arg, right: arg, before: retu);
   
   m.dump;
   m.delete;

Modified: branches/llvm-backend/llvm-glue.cc
==============================================================================
--- branches/llvm-backend/llvm-glue.cc  (original)
+++ branches/llvm-backend/llvm-glue.cc  Mon Mar  7 23:41:33 2005
@@ -21,6 +21,7 @@
     typedef ELEM* iterator;
     typedef const ELEM* const_iterator;
 
+    std::size_t size(void) const { return elems; }
     iterator begin(void) { return arr; }
     iterator end(void) { return arr + elems; }
     const_iterator begin(void) const { return arr; }
@@ -81,8 +82,9 @@
 LLVM_MAKE_SIMPLE(ReturnInst, (/*val, beforeinstr*/ BasicBlock* atEnd), (atEnd))
 
 
+// desc_const_iterator
 template <typename T>
-struct desc_const_iterator // : std::random_access_iterator<T, std::ptrdiff_t>
+struct desc_const_iterator
 {
   desc_const_iterator(const desc* d)
   : d(d)
@@ -102,6 +104,29 @@
   const desc* d;
 };
 
+// desc_iterator
+template <typename T>
+struct desc_iterator
+{
+  desc_iterator(const desc* d)
+  : d(d)
+  {}
+  
+  T operator * (void) const { return extract(*d, static_cast<T*>(0)); }
+  std::ptrdiff_t operator - (const desc_iterator<T>& rhs) const { return d - 
rhs.d; }
+  desc_iterator<T>& operator ++ (void) { ++d; return *this; }
+
+private:
+  static inline long extract(const desc& d, long*)
+  { return d.dataword.l; }
+  
+  static inline T extract(const desc& d, T*)
+  { return static_cast<T>(d.dataword.ptr); }
+  
+  const desc* d;
+};
+
+// iterator_traits
 namespace std {
   template <typename T>
   struct iterator_traits< desc_const_iterator<T> >
@@ -110,16 +135,47 @@
     typedef T value_type;
     typedef ptrdiff_t difference_type;
   };
+
+  template <typename T>
+  struct iterator_traits< desc_iterator<T> >
+  {
+    typedef typename iterator_traits<T*>::iterator_category iterator_category;
+    typedef T value_type;
+    typedef ptrdiff_t difference_type;
+  };
 }
 
 
 LLVM_MAKE(FunctionType, (const Type* result, const SimpleObjectVector* 
argtypes, bool isVarArg))
 {
   typedef desc_const_iterator<const Type*> extr;
-  std::vector<const Type*> params(extr(argtypes->begin()), 
extr(argtypes->end()));
+  const std::vector<const Type*> params(extr(argtypes->begin()), 
extr(argtypes->end()));
   return FunctionType::get(result, params, isVarArg);
 }
 
+
+LLVM_MAKE(GetElementPtrInst, (Value* ptr, const SimpleObjectVector* indices, 
const ByteString* name, BasicBlock* atEnd, Instruction* before))
+{
+  typedef desc_iterator<Value*> extr;
+  const extr first(indices->begin());
+  if (2 == indices->size())
+  {
+    extr second(first);
+    ++second;
+    return before
+      ? new GetElementPtrInst(ptr, *first, *second, *name, before)
+      : new GetElementPtrInst(ptr, *first, *second, *name, atEnd);
+  }
+  else
+  {
+    const std::vector<Value*> inds(first, extr(indices->end()));
+    return before
+      ? new GetElementPtrInst(ptr, inds, *name, before)
+      : new GetElementPtrInst(ptr, inds, *name, atEnd);
+  }
+}
+
+
 LLVM_MAKE_SIMPLE(Argument, (const Type* ty, const ByteString* name, Function* 
fun), (ty, *name, fun))
 /*
 LLVM_MAKE_SIMPLE(, , )
@@ -133,33 +189,13 @@
         : BinaryOperator::create(op, v1, v2, *name, atEnd);
 }
 
-/*
-BinaryOperator* make_llvm_Add(Value* v1, Value* v2, const ByteString* name, 
BasicBlock* atEnd, Instruction* before)
-{
-  return make_llvm_BinaryOperator(Instruction::Add, v1, v2, name, atEnd, 
before);
-}
-*/
-
-typedef BinaryOperator
-  BinaryAdd,
-  BinarySub,
-  BinaryMul,
-  BinaryDiv,
-  BinaryRem,
-  BinaryAnd,
-  BinaryOr,
-  BinaryXor,
-  BinarySetEQ,
-  BinarySetNE,
-  BinarySetLE,
-  BinarySetGE,
-  BinarySetLT,
-  BinarySetGT;
-
 #define LLVM_MAKE_BINARY(OP) \
+  typedef BinaryOperator Binary ## OP; \
   LLVM_MAKE(Binary ## OP, (Value* v1, Value* v2, const ByteString* name, 
BasicBlock* atEnd, Instruction* before)) \
   { return make_llvm_BinaryOperator(Instruction::OP, v1, v2, name, atEnd, 
before); }
 
+
+/*
 LLVM_MAKE_BINARY(Add)
 LLVM_MAKE_BINARY(Sub)
 LLVM_MAKE_BINARY(Mul)
@@ -174,6 +210,26 @@
 LLVM_MAKE_BINARY(SetGE)
 LLVM_MAKE_BINARY(SetLT)
 LLVM_MAKE_BINARY(SetGT)
+*/
+
+#define HANDLE_BINARY_INST(num, opcode, Class) \
+  LLVM_MAKE_BINARY(opcode)
+
+
+#include "/usr/local/include/llvm/Instruction.def"
+//#include "llvm/Instructions.def"
+
+
+/*
+// Memory operators...
+ FIRST_MEMORY_INST(21)
+HANDLE_MEMORY_INST(21, Malloc, MallocInst)  // Heap management instructions
+HANDLE_MEMORY_INST(22, Free  , FreeInst  )
+HANDLE_MEMORY_INST(23, Alloca, AllocaInst)  // Stack management
+HANDLE_MEMORY_INST(24, Load  , LoadInst  )  // Memory manipulation instrs
+HANDLE_MEMORY_INST(25, Store , StoreInst )
+HANDLE_MEMORY_INST(26, GetElementPtr, GetElementPtrInst)
+*/
 
 
 #define LLVM_DELETER(CLASS) \
-- 
Gd-chatter mailing list
Gd-chatter@xxxxxxxxxxxxxxxx
https://gauss.gwydiondylan.org/mailman/listinfo/gd-chatter




Try Searching:
servers, voip, java, networking, microsoft ...
<Prev in Thread] Current Thread [Next in Thread>