Newbie questions about Pliant

Newbie questions about Pliant

referencing constants

A string "hello world" in the program starts
at some memory location.
Message posted by maybe Boris Reitman on 2009/03/02 18:38:14
Hi Hubert,


For this sample program:

----- a.pli ---------
module "b.pli"
function test
 say_hello
test
---------------------

-------- b.pli ------
function say_hello
 console "hello_world[lf]"

export say_hello
---------------------

I am getting output:

-------------------
boris@freedom:/pliant/pliant/language/optimizer$ pliant reset module
/pliant/language/optimizer/gcc.pli module /boris.reitman/a.pli
 using GCC optimizer
// function say_hello
//
//
// /boris.reitman/b.pli (internals) 1 1

void fB6DB9A50_0804AE34(int *);     // console

void foo()
{
fB6DB9A50_0804AE34((int *)0xB6E0C820);
/* nop */
}
// function test

//
//
// /boris.reitman/a.pli (internals) 2 1

void fB6E0DB20_B6E0AEA0();     // say_hello /boris.reitman/b.pli (internals) 1 1

void foo()
{
fB6E0DB20_B6E0AEA0();
/* nop */
}
hello_world
------------------------------------

My question is how do you recommend handling the memory addresses for string 
constants "0xB6E0C820" ? I need to somehow declare in C that 
0xB6E0C820 is "Hello World", but if I understand correctly 
the value 0xB6E0C820 is something representative of the runtime memory layout,
and I need some-kind of mapping. What do you think is the cleanest way to do it?
"
Thank you,
Boris
Message posted by maybe Bori s Reitman on 2009/03/07 19:05:48
More constants problems:

--------------->8---------------
void f8049DD0(int *,int *);     // copy
void c_puts(int *);     // c_puts /muzzammil/samples/main.pli (internals) 3 1

int main()
{
int v0[2];
((void (*)(int *,int *))0x804E705)((int *)0xB6D928C0,v0);
f8049DD0((int *)0xB6E11B78,v0);
c_puts(v0);
/* nop */
((void (*)(int *,int *))0x804BD4F)((int *)0xB6D928C0,v0);
}

-----------8<----------------

I am just trying to get console to work, to be able to print something.
It keeps putting all those memory addresses which are meaningless for 
generating code to be compiled later.  This is what I got for:


function main_c_function -> r
  arg Int r
  var Str result := 'convert to string':(fact 5)+"[lf]"
  c_puts result


c_puts is just a dummy function. 

--------8<-----------
boris@freedom:/pliant/muzzammil$ cat support.c
#include <stdio.h>

struct Str {
  char *chars;
  int len2; };

void c_puts(int *ptr) {
  struct Str *str = (struct Str*) ptr;
  printf("%i\n", str->len2);
}
---------->8---------

How do I disable the part of the compiler that puts memory 
address for the arguments ?
Message posted by maybe Hubert Tonneau on 2009/03/12 22:27:50
Sorry for the long delay.

Getting the name of the function instead of just it's address should be easy
since 'name' is one of the fields of 'Function' data type.
Also you will probably have to generate mangled names a la C++.

About the constants, this is the hard part.
First, you have to check if all constants you receive are true Pliant object.
I bet it is true.
Then you have to provide some functions to generate the C code that will build
the constant at C application startup time.
So, you end with the simple conclusion: your Pliant to C translator will
probably not be abble to translate any Pliant application, just the ones that
use the subset of the Pliant capabilities you support.
What I would try about the constants is to generate all of them as global
variables, and identify them according to their address.
If you receive a constant at address A033AC06h, then I suggest you to create
a C global variable with name cA033AC06. The reason is that you probably have
no way to identify what is a Pliant constant from what is a Pliant global
variable.

You probably also have to create some minimal run time environment to enable
Pliant object model (pointer to the data type that provides build, destroy
and copy functions, plus references count).