diff options
| author | Cameron Esfahani <dirty@apple.com> | 2010-09-15 00:28:12 +0000 |
|---|---|---|
| committer | Cameron Esfahani <dirty@apple.com> | 2010-09-15 00:28:12 +0000 |
| commit | eb85650e6732c10b361d6e66e2cd25624d7a98b9 (patch) | |
| tree | 3c0f37f1b069a8ebe696ae2aea24d49136781b79 | |
| parent | f657b639fda1940534a305ddd7d26bf323666a14 (diff) | |
| download | bcm5719-llvm-eb85650e6732c10b361d6e66e2cd25624d7a98b9.tar.gz bcm5719-llvm-eb85650e6732c10b361d6e66e2cd25624d7a98b9.zip | |
Fix Windows64 target info so pointer arithmetic is done correctly, and no sign extension code is emitted: PtrDiffType needs to be a signed long long. Add a corresponding test case.
llvm-svn: 113910
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 3 | ||||
| -rw-r--r-- | clang/test/CodeGen/pointer-signext.c | 32 |
2 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index df20defa0fc..1896b5916bd 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -1483,6 +1483,9 @@ public: IntMaxType = SignedLongLong; UIntMaxType = UnsignedLongLong; Int64Type = SignedLongLong; + SizeType = UnsignedLongLong; + PtrDiffType = SignedLongLong; + IntPtrType = SignedLongLong; } virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { diff --git a/clang/test/CodeGen/pointer-signext.c b/clang/test/CodeGen/pointer-signext.c new file mode 100644 index 00000000000..e6bdbcc86e4 --- /dev/null +++ b/clang/test/CodeGen/pointer-signext.c @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -triple x86_64-pc-win32 -emit-llvm -O2 -o - %s | FileCheck %s + +// Under Windows 64, int and long are 32-bits. Make sure pointer math doesn't +// cause any sign extensions. + +// CHECK: %sub.ptr.sub = add i64 %param, -8 +// CHECK: %0 = inttoptr i64 %sub.ptr.sub to %struct.anon* +// CHECK: %tmp3 = getelementptr inbounds %struct.anon* %0, i64 0, i32 0 + +#define CR(Record, TYPE, Field) \ + ((TYPE *) ((unsigned char *) (Record) - (unsigned char *) &(((TYPE *) 0)->Field))) + +typedef struct _LIST_ENTRY { + struct _LIST_ENTRY *ForwardLink; + struct _LIST_ENTRY *BackLink; +} LIST_ENTRY; + +typedef struct { + unsigned long long Signature; + LIST_ENTRY Link; +} MEMORY_MAP; + +int test(unsigned long long param) +{ + LIST_ENTRY *Link; + MEMORY_MAP *Entry; + + Link = (LIST_ENTRY *) param; + + Entry = CR (Link, MEMORY_MAP, Link); + return (int) Entry->Signature; +} |

