[LLVMbugs] [Bug 677] NEW: Pure virtual class function results in invalid emitted C code

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Thu Dec 15 05:04:17 PST 2005


http://llvm.cs.uiuc.edu/bugs/show_bug.cgi?id=677

           Summary: Pure virtual class function results in invalid emitted C
                    code
           Product: tools
           Version: 1.6
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: critical
          Priority: P2
         Component: llc
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: satayguy_junk at yahoo.com.sg


Defining a pure virtual class function in a C++ class results in code that can
compiled and interpreted lli. However, compiling the emitted C code results in a
linking error.

Reproduction Steps
==================
1. The following files were created. (See below for source codes)
   i) main.cpp
   ii) module.h
   iii) module.cpp

2. They were then compiled using the following commands.
   # llvm-g++ -o main main.cpp
   # llvm-g++ -c -o module.bc module.cpp
   # llvm-link -f -o=generated.bc main.bc module.bc
   # llc -f -march=c -o=generated.c generated.bc

3. Running generated.bc has no problems.
   # lli generated.bc
   Class 1::TestAbstract called

4. However, compiling the generated.c source file results in a linker error.
   # gcc generated.c
   generated.c:159: warning: conflicting types for built-in function 'malloc'
   /tmp/ccKoyQ2T.o(.data+0x68): undefined reference to `__cxa_pure_virtual'
   /tmp/ccKoyQ2T.o(.data+0x8c): undefined reference to `vtable for
__cxxabiv1::__si_class_type_info'
   /tmp/ccKoyQ2T.o(.data+0x98): undefined reference to `vtable for
__cxxabiv1::__class_type_info'

PC System
=========
Distro: Fedora Core 3
Arch: x86
Kernel version: Linux 2.6.9-1.667
GCC version: gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
LLVM version: 1.6
LLVM GCC Frontend version: 1.6 GCC Front End Binaries for Linux/x86

Source Codes
============
i. main.cpp
-----------
#include <stdio.h>
#include <string.h>
#include "module.h"

int main(void)
{
	CClass1 class1;

	class1.TestAbstract();
}

ii. module.h
------------
class CAbstract
{
public:
	virtual void TestAbstract() = 0;
};

class CClass1 : public CAbstract
{
public:
	void TestAbstract();
};

iii. module.cpp
---------------
#include <string.h>
#include <stdio.h>
#include "module.h"

void CClass1::TestAbstract()
{
	printf("Class 1::TestAbstract called\n");
}



------- 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