[LLVMbugs] [Bug 9740] New: CBE does not generate weak aliases
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Sun Apr 17 12:15:54 PDT 2011
http://llvm.org/bugs/show_bug.cgi?id=9740
Summary: CBE does not generate weak aliases
Product: new-bugs
Version: trunk
Platform: PC
OS/Version: Linux
Status: NEW
Severity: normal
Priority: P
Component: new bugs
AssignedTo: unassignedbugs at nondot.org
ReportedBy: maemarcus at gmail.com
CC: llvmbugs at cs.uiuc.edu
Consider the test case:
#pragma weak func_alias = func
int func()
{
return 0;
}
====================
bytecode looks good:
====================
[marcusmae at T61p weak]$ dragonegg-gcc
-fplugin=/opt/llvm/dragonegg/lib64/dragonegg.so -fplugin-arg-dragonegg-emit-ir
-S weak.c -o weak.ll
[marcusmae at T61p weak]$ cat weak.ll
; ModuleID = 'weak.c'
target datalayout =
"e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-f128:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
module asm "\09.ident\09\22GCC: (GNU) 4.5.3 20110415 (prerelease) LLVM:
129562\22"
%int = type i32
@func_alias = alias weak i32 ()* @func
define i32 @func() nounwind {
entry:
%memtmp = alloca i32
%"alloca point" = bitcast i32 0 to i32
%"ssa point" = bitcast i32 0 to i32
br label %"2"
"2": ; preds = %entry
store i32 0, i32* %memtmp, align 1
br label %return
return: ; preds = %"2"
%retval = load i32* %memtmp
ret i32 %retval
}
===================================
Now, generating back to C with CBE:
===================================
[marcusmae at T61p weak]$ /opt/llvm/bin/llc -march=c weak.ll -o weak.ll.c
[marcusmae at T61p weak]$ cat weak.ll.c
/* Provide Declarations */
#include <stdarg.h>
#include <setjmp.h>
/* get a declaration for alloca */
#if defined(__CYGWIN__) || defined(__MINGW32__)
#define alloca(x) __builtin_alloca((x))
#define _alloca(x) __builtin_alloca((x))
#elif defined(__APPLE__)
extern void *__builtin_alloca(unsigned long);
#define alloca(x) __builtin_alloca(x)
#define longjmp _longjmp
#define setjmp _setjmp
#elif defined(__sun__)
#if defined(__sparcv9)
extern void *__builtin_alloca(unsigned long);
#else
extern void *__builtin_alloca(unsigned int);
#endif
#define alloca(x) __builtin_alloca(x)
#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) ||
defined(__DragonFly__) || defined(__arm__)
#define alloca(x) __builtin_alloca(x)
#elif defined(_MSC_VER)
#define inline _inline
#define alloca(x) _alloca(x)
#else
#include <alloca.h>
#endif
#ifndef __GNUC__ /* Can only support "linkonce" vars with GCC */
#define __attribute__(X)
#endif
#if defined(__GNUC__) && defined(__APPLE_CC__)
#define __EXTERNAL_WEAK__ __attribute__((weak_import))
#elif defined(__GNUC__)
#define __EXTERNAL_WEAK__ __attribute__((weak))
#else
#define __EXTERNAL_WEAK__
#endif
#if defined(__GNUC__) && defined(__APPLE_CC__)
#define __ATTRIBUTE_WEAK__
#elif defined(__GNUC__)
#define __ATTRIBUTE_WEAK__ __attribute__((weak))
#else
#define __ATTRIBUTE_WEAK__
#endif
#if defined(__GNUC__)
#define __HIDDEN__ __attribute__((visibility("hidden")))
#endif
#ifdef __GNUC__
#define LLVM_NAN(NanStr) __builtin_nan(NanStr) /* Double */
#define LLVM_NANF(NanStr) __builtin_nanf(NanStr) /* Float */
#define LLVM_NANS(NanStr) __builtin_nans(NanStr) /* Double */
#define LLVM_NANSF(NanStr) __builtin_nansf(NanStr) /* Float */
#define LLVM_INF __builtin_inf() /* Double */
#define LLVM_INFF __builtin_inff() /* Float */
#define LLVM_PREFETCH(addr,rw,locality) __builtin_prefetch(addr,rw,locality)
#define __ATTRIBUTE_CTOR__ __attribute__((constructor))
#define __ATTRIBUTE_DTOR__ __attribute__((destructor))
#define LLVM_ASM __asm__
#else
#define LLVM_NAN(NanStr) ((double)0.0) /* Double */
#define LLVM_NANF(NanStr) 0.0F /* Float */
#define LLVM_NANS(NanStr) ((double)0.0) /* Double */
#define LLVM_NANSF(NanStr) 0.0F /* Float */
#define LLVM_INF ((double)0.0) /* Double */
#define LLVM_INFF 0.0F /* Float */
#define LLVM_PREFETCH(addr,rw,locality) /* PREFETCH */
#define __ATTRIBUTE_CTOR__
#define __ATTRIBUTE_DTOR__
#define LLVM_ASM(X)
#endif
#if __GNUC__ < 4 /* Old GCC's, or compilers not GCC */
#define __builtin_stack_save() 0 /* not implemented */
#define __builtin_stack_restore(X) /* noop */
#endif
#if __GNUC__ && __LP64__ /* 128-bit integer types */
typedef int __attribute__((mode(TI))) llvmInt128;
typedef unsigned __attribute__((mode(TI))) llvmUInt128;
#endif
#define CODE_FOR_MAIN() /* Any target-specific code for main()*/
#ifndef __cplusplus
typedef unsigned char bool;
#endif
/* Support for floating point constants */
typedef unsigned long long ConstantDoubleTy;
typedef unsigned int ConstantFloatTy;
typedef struct { unsigned long long f1; unsigned short f2; unsigned short
pad[3]; } ConstantFP80Ty;
typedef struct { unsigned long long f1; unsigned long long f2; }
ConstantFP128Ty;
/* Global Declarations */
/* Module asm statements */
asm("\t.ident\t\"GCC: (GNU) 4.5.3 20110415 (prerelease) LLVM: 129562\"\n"
"");
/* End Module asm statements */
/* Helper union for bitcasts */
typedef union {
unsigned int Int32;
unsigned long long Int64;
float Float;
double Double;
} llvmBitCastUnion;
/* Function Declarations */
double fmod(double, double);
float fmodf(float, float);
long double fmodl(long double, long double);
unsigned int func(void);
void abort(void);
/* Function Bodies */
static inline int llvm_fcmp_ord(double X, double Y) { return X == X && Y == Y;
}
static inline int llvm_fcmp_uno(double X, double Y) { return X != X || Y != Y;
}
static inline int llvm_fcmp_ueq(double X, double Y) { return X == Y ||
llvm_fcmp_uno(X, Y); }
static inline int llvm_fcmp_une(double X, double Y) { return X != Y; }
static inline int llvm_fcmp_ult(double X, double Y) { return X < Y ||
llvm_fcmp_uno(X, Y); }
static inline int llvm_fcmp_ugt(double X, double Y) { return X > Y ||
llvm_fcmp_uno(X, Y); }
static inline int llvm_fcmp_ule(double X, double Y) { return X <= Y ||
llvm_fcmp_uno(X, Y); }
static inline int llvm_fcmp_uge(double X, double Y) { return X >= Y ||
llvm_fcmp_uno(X, Y); }
static inline int llvm_fcmp_oeq(double X, double Y) { return X == Y ; }
static inline int llvm_fcmp_one(double X, double Y) { return X != Y &&
llvm_fcmp_ord(X, Y); }
static inline int llvm_fcmp_olt(double X, double Y) { return X < Y ; }
static inline int llvm_fcmp_ogt(double X, double Y) { return X > Y ; }
static inline int llvm_fcmp_ole(double X, double Y) { return X <= Y ; }
static inline int llvm_fcmp_oge(double X, double Y) { return X >= Y ; }
unsigned int func(void) {
unsigned int llvm_cbe_memtmp; /* Address-exposed local */
unsigned int llvm_cbe_alloca_20_point;
unsigned int llvm_cbe_ssa_20_point;
unsigned int llvm_cbe_retval;
llvm_cbe_alloca_20_point = ((unsigned int )0u);
llvm_cbe_ssa_20_point = ((unsigned int )0u);
((struct __attribute__ ((packed, aligned(1))) {unsigned int data; }
*)(&llvm_cbe_memtmp))->data = 0u;
llvm_cbe_retval = *(&llvm_cbe_memtmp);
return llvm_cbe_retval;
}
===================================================
So, no code is generated for alias, resulting into:
===================================================
[marcusmae at T61p weak]$ gcc -c weak.ll.c -o weak.ll.o
[marcusmae at T61p weak]$ nm weak.ll.o
0000000000000000 T func
=======================================================
The expected correct result could be produced with gcc:
=======================================================
[marcusmae at T61p weak]$ gcc -c weak.c -o weak.o
[marcusmae at T61p weak]$ nm weak.o
0000000000000000 T func
0000000000000000 W func_alias
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list