initializer does not match global variable type.

Right. This looks like it's just a simple bug in llvm2cpp.
CppWriter.cpp:698 contains:

    if (CA->isString() && CA->getType()->getElementType() ==
Type::SByteTy) {
      Out << "Constant* " << constName << " = ConstantArray::get(\"";
      printEscapedString(CA->getAsString());
      // Determine if we want null termination or not.
      if (CA->getType()->getNumElements() <=
CA->getAsString().length())
        Out << "\", false";// No null terminator
      else
        Out << "\", true"; // Indicate that the null
terminator should be added.
      Out << ");";
    } else {

This doesn't handle null terminated strings right (the "<=" check is
wrong) and could never handle strings (or other arrays) with
nulls in the
middle of them. Try removing that chunk of code and seeing if
the 'else'
block works.

Making this change removed the error statements that I was initially
receiving. However, I thought that if you compiled the output of
llvm2cpp
and ran it you should get the same output as if you compiled and
ran the objective-c file directly. Instead, I still get the following
when I try to run the compiled C++ file. Is there some sort of option
or step in the process I'm missing?

; ModuleID = 'bar.bc'
target endian = little
target pointersize = 32
target triple = "i686-pc-linux-gnu"
deplibs = [ "objc", "c", "crtend" ]
  %struct._objc_module = type { int, int, sbyte*,
%struct._objc_symtab* }
  %struct._objc_selector = type { sbyte*, sbyte* }
  %struct._objc_symtab = type { int, %struct._objc_selector**,
short, short, [2 x sbyte*] }
  %struct.objc_class = type { %struct.objc_class*,
%struct.objc_class*, sbyte*, int, uint, int, %struct.objc_ivar_list*,
%struct.objc_method_list*, %struct.sarray*, %struct.objc_class*,
%struct.objc_class*, %struct.objc_protocol_list*, sbyte* }
  %struct.objc_ivar_list = type opaque
  %struct.objc_method_list = type opaque
  %struct.objc_object = type { %struct.objc_class* }
  %struct.objc_protocol_list = type opaque
  %struct.sarray = type opaque
%llvm.global_ctors = appending global [1 x { int, void ()* }] [ { int,
void ()* } { int 65535, void ()* %_GLOBAL__I_main } ] ; <[1 x
{ int, void ()* }]*> [#uses=0]
%.str_2 = internal constant [13 x sbyte] c"Hello world\0A\00"
; <[13 x sbyte]*> [#uses=1]
%.str_3 = internal constant [9 x sbyte] c"Fraction\00" ; <[9 x
sbyte]*> [#uses=1]
%.str_4 = internal constant [2 x sbyte] c"\0A\00" ; <[2 x
sbyte]*> [#uses=1]
%_OBJC_SELECTOR_TABLE = internal global [6 x %struct._objc_selector]
zeroinitializer ; <[6 x %struct._objc_selector]*> [#uses=5]
%_OBJC_MODULES = internal global %struct._objc_module zeroinitializer
; <%struct._objc_module*> [#uses=1]
%__objc_class_name_Fraction = constant uint 0 ; <uint*>
[#uses=0]

implementation ; Functions:

declare int %printf(sbyte*, ...)

declare %struct.objc_object* %objc_get_class(sbyte*)

int %main(int %argc, sbyte** %argv) {
entry:
  tail call void %__main( )
  %tmp.0 = tail call int (sbyte*, ...)* %printf( sbyte*
getelementptr ([13 x sbyte]* %.str_2, int 0, int 0) ) ; <int>
[#uses=0]
  %tmp.5 = tail call %struct.objc_object* %objc_get_class( sbyte*
getelementptr ([9 x sbyte]* %.str_3, int 0, int 0) ) ;
<%struct.objc_object*> [#uses=2]
  %tmp.3 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object* %tmp.5,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 0) ) ; <%struct.objc_object*
(%struct.objc_object*, %struct._objc_selector*, ...)*> [#uses=1]
  %tmp.10 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.3( %struct.objc_object* %tmp.5,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 0) ) ; <%struct.objc_object*>
[#uses=2]
  %tmp.2 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.10, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 1) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  %tmp.16 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.2( %struct.objc_object* %tmp.10,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 1) ) ; <%struct.objc_object*>
[#uses=6]
  %tmp.20 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.16, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 2) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.20( %struct.objc_object* %tmp.16,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 2), int 1 ) ;
<%struct.objc_object*>:0 [#uses=0]
  %tmp.29 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.16, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 3) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.29( %struct.objc_object* %tmp.16,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 3), int 3 ) ;
<%struct.objc_object*>:1 [#uses=0]
  %tmp.38 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.16, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 4) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.38( %struct.objc_object* %tmp.16,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 4) ) ;
<%struct.objc_object*>:2 [#uses=0]
  %tmp.47 = tail call int (sbyte*, ...)* %printf( sbyte*
getelementptr ([2 x sbyte]* %.str_4, int 0, int 0) ) ; <int>
[#uses=0]
  ret int 0
}

declare void %__main()

declare %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %objc_msg_lookup(%struct.objc_object*,
%struct._objc_selector*)

internal void %_GLOBAL__I_main() {
entry:
  tail call void %__objc_exec_class( sbyte* cast
(%struct._objc_module* %_OBJC_MODULES to sbyte*) )
  ret void
}

declare void %__objc_exec_class(sbyte*)

Making this change removed the error statements that I was initially
receiving. However, I thought that if you compiled the output of
llvm2cpp
and ran it you should get the same output as if you compiled and
ran the objective-c file directly.

No. llvm2cpp turns an llvm module into the C++ code that will produce the module, it doesn't turn it into C++ code that represents the program.

Instead, I still get the following when I try to run the compiled C++ file. Is there some sort of option or step in the process I'm missing?

You want the C backend as I mentioned before.

Try:

llc -march=c x.bc -o x.c
gcc x.c
./a.out

That will run x.bc (assuming you don't need any libraries to link against, etc).

-chris

; ModuleID = 'bar.bc'
target endian = little
target pointersize = 32
target triple = "i686-pc-linux-gnu"
deplibs = [ "objc", "c", "crtend" ]
  %struct._objc_module = type { int, int, sbyte*,
%struct._objc_symtab* }
  %struct._objc_selector = type { sbyte*, sbyte* }
  %struct._objc_symtab = type { int, %struct._objc_selector**,
short, short, [2 x sbyte*] }
  %struct.objc_class = type { %struct.objc_class*,
%struct.objc_class*, sbyte*, int, uint, int, %struct.objc_ivar_list*,
%struct.objc_method_list*, %struct.sarray*, %struct.objc_class*,
%struct.objc_class*, %struct.objc_protocol_list*, sbyte* }
  %struct.objc_ivar_list = type opaque
  %struct.objc_method_list = type opaque
  %struct.objc_object = type { %struct.objc_class* }
  %struct.objc_protocol_list = type opaque
  %struct.sarray = type opaque
%llvm.global_ctors = appending global [1 x { int, void ()* }] [ { int,
void ()* } { int 65535, void ()* %_GLOBAL__I_main } ] ; <[1 x
{ int, void ()* }]*> [#uses=0]
%.str_2 = internal constant [13 x sbyte] c"Hello world\0A\00"
; <[13 x sbyte]*> [#uses=1]
%.str_3 = internal constant [9 x sbyte] c"Fraction\00" ; <[9 x
sbyte]*> [#uses=1]
%.str_4 = internal constant [2 x sbyte] c"\0A\00" ; <[2 x
sbyte]*> [#uses=1]
%_OBJC_SELECTOR_TABLE = internal global [6 x %struct._objc_selector]
zeroinitializer ; <[6 x %struct._objc_selector]*> [#uses=5]
%_OBJC_MODULES = internal global %struct._objc_module zeroinitializer
; <%struct._objc_module*> [#uses=1]
%__objc_class_name_Fraction = constant uint 0 ; <uint*>
[#uses=0]

implementation ; Functions:

declare int %printf(sbyte*, ...)

declare %struct.objc_object* %objc_get_class(sbyte*)

int %main(int %argc, sbyte** %argv) {
entry:
  tail call void %__main( )
  %tmp.0 = tail call int (sbyte*, ...)* %printf( sbyte*
getelementptr ([13 x sbyte]* %.str_2, int 0, int 0) ) ; <int>
[#uses=0]
  %tmp.5 = tail call %struct.objc_object* %objc_get_class( sbyte*
getelementptr ([9 x sbyte]* %.str_3, int 0, int 0) ) ;
<%struct.objc_object*> [#uses=2]
  %tmp.3 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object* %tmp.5,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 0) ) ; <%struct.objc_object*
(%struct.objc_object*, %struct._objc_selector*, ...)*> [#uses=1]
  %tmp.10 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.3( %struct.objc_object* %tmp.5,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 0) ) ; <%struct.objc_object*>
[#uses=2]
  %tmp.2 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.10, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 1) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  %tmp.16 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.2( %struct.objc_object* %tmp.10,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 1) ) ; <%struct.objc_object*>
[#uses=6]
  %tmp.20 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.16, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 2) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.20( %struct.objc_object* %tmp.16,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 2), int 1 ) ;
<%struct.objc_object*>:0 [#uses=0]
  %tmp.29 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.16, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 3) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.29( %struct.objc_object* %tmp.16,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 3), int 3 ) ;
<%struct.objc_object*>:1 [#uses=0]
  %tmp.38 = tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* (%struct.objc_object*,
%struct._objc_selector*)* %objc_msg_lookup( %struct.objc_object*
%tmp.16, %struct._objc_selector* getelementptr ([6 x
%struct._objc_selector]* %_OBJC_SELECTOR_TABLE, int 0, int 4) )
; <%struct.objc_object* (%struct.objc_object*, %struct._objc_selector*,
...)*> [#uses=1]
  tail call %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %tmp.38( %struct.objc_object* %tmp.16,
%struct._objc_selector* getelementptr ([6 x %struct._objc_selector]*
%_OBJC_SELECTOR_TABLE, int 0, int 4) ) ;
<%struct.objc_object*>:2 [#uses=0]
  %tmp.47 = tail call int (sbyte*, ...)* %printf( sbyte*
getelementptr ([2 x sbyte]* %.str_4, int 0, int 0) ) ; <int>
[#uses=0]
  ret int 0
}

declare void %__main()

declare %struct.objc_object* (%struct.objc_object*,
%struct._objc_selector*, ...)* %objc_msg_lookup(%struct.objc_object*,
%struct._objc_selector*)

internal void %_GLOBAL__I_main() {
entry:
  tail call void %__objc_exec_class( sbyte* cast
(%struct._objc_module* %_OBJC_MODULES to sbyte*) )
  ret void
}

declare void %__objc_exec_class(sbyte*)

_______________________________________________
LLVM Developers mailing list
LLVMdev@cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-Chris