[LLVMbugs] [Bug 1525] NEW: llvm CVS: llvm2cpp generates incorrect code when string are used

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Thu Jun 21 01:34:05 PDT 2007


http://llvm.org/bugs/show_bug.cgi?id=1525

           Summary: llvm CVS: llvm2cpp generates incorrect code when string
                    are used
           Product: new-bugs
           Version: unspecified
          Platform: Macintosh
        OS/Version: MacOS X
            Status: NEW
          Severity: normal
          Priority: P2
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: letz at grame.fr


llvm2cpp generates incorrect code, that does not run correctly when compiled and run, when string are 
used:

Starting from the following code:

#include <stdio.h>

int main()
{
	printf("foo");
	return 0;
}

the generated code is: 

// Generated by llvm2cpp - DO NOT MODIFY!

#include <llvm/Module.h>
#include <llvm/DerivedTypes.h>
#include <llvm/Constants.h>
#include <llvm/GlobalVariable.h>
#include <llvm/Function.h>
#include <llvm/CallingConv.h>
#include <llvm/BasicBlock.h>
#include <llvm/Instructions.h>
#include <llvm/InlineAsm.h>
#include <llvm/ParameterAttributes.h>
#include <llvm/Support/MathExtras.h>
#include <llvm/Pass.h>
#include <llvm/PassManager.h>
#include <llvm/Analysis/Verifier.h>
#include <llvm/Assembly/PrintModulePass.h>
#include <algorithm>
#include <iostream>

using namespace llvm;

Module* makeLLVMModule();

int main(int argc, char**argv) {
  Module* Mod = makeLLVMModule();
  verifyModule(*Mod, PrintMessageAction);
  std::cerr.flush();
  std::cout.flush();
  PassManager PM;
  PM.add(new PrintModulePass(&llvm::cout));
  PM.run(*Mod);
  return 0;
}


Module* makeLLVMModule() {
  // Module Construction
  Module* mod = new Module("function.bc");
  mod->setDataLayout("e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-
f64:32:64-v64:64:64-v128:128:128-a0:0:64");
  mod->setTargetTriple("i686-apple-darwin8.9.1");
  
  // Type Definitions
  ArrayType* ArrayTy_0 = ArrayType::get(IntegerType::get(8), 4);
  
  PointerType* PointerTy_1 = PointerType::get(ArrayTy_0);
  
  std::vector<const Type*>FuncTy_2_args;
  ParamAttrsList *FuncTy_2_PAL = 0;
  FunctionType* FuncTy_2 = FunctionType::get(
    /*Result=*/IntegerType::get(32),
    /*Params=*/FuncTy_2_args,
    /*isVarArg=*/false,
    /*ParamAttrs=*/FuncTy_2_PAL);
  
  std::vector<const Type*>FuncTy_4_args;
  PointerType* PointerTy_5 = PointerType::get(IntegerType::get(8));
  
  FuncTy_4_args.push_back(PointerTy_5);
  ParamAttrsList *FuncTy_4_PAL = 0;
  FunctionType* FuncTy_4 = FunctionType::get(
    /*Result=*/IntegerType::get(32),
    /*Params=*/FuncTy_4_args,
    /*isVarArg=*/true,
    /*ParamAttrs=*/FuncTy_4_PAL);
  
  PointerType* PointerTy_3 = PointerType::get(FuncTy_4);
  
  
  // Function Declarations
  
  Function* func_main = new Function(
    /*Type=*/FuncTy_2,
    /*Linkage=*/GlobalValue::ExternalLinkage,
    /*Name=*/"main", mod); 
  func_main->setCallingConv(CallingConv::C);
  
  Function* func_printf = new Function(
    /*Type=*/FuncTy_4,
    /*Linkage=*/GlobalValue::ExternalLinkage,
    /*Name=*/"printf", mod); // (external, no body)
  func_printf->setCallingConv(CallingConv::C);
  
  // Global Variable Declarations

  
  GlobalVariable* gvar_array__str = new GlobalVariable(
  /*Type=*/ArrayTy_0,
  /*isConstant=*/true,
  /*Linkage=*/GlobalValue::InternalLinkage,
  /*Initializer=*/0, // has initializer, specified below
  /*Name=*/".str",
  mod);
  
  // Constant Definitions
  Constant* const_array_6 = ConstantArray::get("foo\x00", false);
  std::vector<Constant*> const_ptr_7_indices;
  Constant* const_int32_8 = Constant::getNullValue(IntegerType::get(32));
  const_ptr_7_indices.push_back(const_int32_8);
  const_ptr_7_indices.push_back(const_int32_8);
  Constant* const_ptr_7 = ConstantExpr::getGetElementPtr(gvar_array__str, &const_ptr_7_indices[0], 2 );
  
  // Global Variable Definitions
  gvar_array__str->setInitializer(const_array_6);
  
  // Function Definitions
  
  // Function: main (func_main)
  {
    
    BasicBlock* label_entry = new BasicBlock("entry",func_main,0);
    
    // Block entry (label_entry)
    CallInst* int32_tmp2 = new CallInst(func_printf, const_ptr_7, "tmp2", label_entry);
    int32_tmp2->setCallingConv(CallingConv::C);
    int32_tmp2->setTailCall(true);
    new ReturnInst(const_int32_8, label_entry);
    
  }
  
  return mod;
}

then when compiled and run give the error:

Global variable initializer type does not match global variable type!
[4 x i8]* @.str
Broken module found, verification continues.
; ModuleID = 'function.bc'
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-
v64:64:64-v128:128:128-a0:0:64"
target triple = "i686-apple-darwin8.9.1"
@.str = internal constant [4 x i8] c"foo"               ; <[4 x i8]*> [#uses=1]

define i32 @main() {
entry:
        %tmp2 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0) )          ; 
<i32> [#uses=0]
        ret i32 0
}

declare i32 @printf(i8*, ...)

If I *manually* edit the gnerated code to be : Constant* const_array_6 = ConstantArray::get("foo ", 
false); then it works.

So the issue seems a string termination problem.



------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.



More information about the llvm-bugs mailing list