[LLVMbugs] [Bug 7784] New: Clang mis-compiles array of unsigned long longs on FreeBSD
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Sun Aug 1 14:17:28 PDT 2010
http://llvm.org/bugs/show_bug.cgi?id=7784
Summary: Clang mis-compiles array of unsigned long longs on
FreeBSD
Product: clang
Version: trunk
Platform: PC
OS/Version: FreeBSD
Status: NEW
Severity: normal
Priority: P
Component: Driver
AssignedTo: unassignedclangbugs at nondot.org
ReportedBy: ed at extraordinarymachine.nl
CC: llvmbugs at cs.uiuc.edu
This is not strictly a clang bug.
The follwing source:
#include <stdio.h>
unsigned long long globalArray[] = {0xFFFFFFFD00000000uLL};
int main()
{
unsigned long long t = 0xFFFFFFFD00000000uLL;
printf("%016llX, %016llu\n", t, t);
printf("%016llX, %016llu\n",
globalArray[0], globalArray[0]);
return 0;
}
results in the following results:
FFFFFFFD00000000, 18446744060824649728
0000FFFD00000000, 0281462091808768
Further investigation by Eli Friedman and Dimitry Andric led to the following
conclusion:
binutils 2.20.1 assembles the following:
.file "quadtest.s"
.type globalArray, at object
.data
.globl globalArray
.align 16
globalArray:
.quad 542196645677236224
.quad -12884901888
.quad 0
.quad 542196645677236224
.size globalArray, 32
wrongly to:
Contents of section .data:
0000 00000000 fa448607 00000000 fdff0000 .....D..........
0010 00000000 00000000 00000000 fa448607 .............D..
The built-in assembler for BSD (2.15) produces:
Contents of section .data:
0000 00000000 fa448607 00000000 fdffffff .....D..........
0010 00000000 00000000 00000000 fa448607 .............D..
which is correct.
This is clearly a bug in binutils and has been filed as such.
(http://sourceware.org/bugzilla/show_bug.cgi?id=11867)
Question is whether to work around this in clang. similar to the OpenBSD test
in lib/Target/X86/X86MCAsmInfo.cpp?
Index: lib/Target/X86/X86MCAsmInfo.cpp
===================================================================
--- lib/Target/X86/X86MCAsmInfo.cpp (revision 109940)
+++ lib/Target/X86/X86MCAsmInfo.cpp (working copy)
@@ -92,7 +92,7 @@
// OpenBSD has buggy support for .quad in 32-bit mode, just split into two
// .words.
if (T.getOS() == Triple::OpenBSD && T.getArch() == Triple::x86)
Data64bitsDirective = 0;
}
--
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