[llvm-commits] [dragonegg] r163786 - in /dragonegg/trunk: src/DefaultABI.cpp test/validator/ada/abi_overflow.adb test/validator/ada/abi_overflow.ads

Duncan Sands baldrick at free.fr
Thu Sep 13 03:47:14 PDT 2012


Author: baldrick
Date: Thu Sep 13 05:47:14 2012
New Revision: 163786

URL: http://llvm.org/viewvc/llvm-project?rev=163786&view=rev
Log:
Treat arrays like structs when passing as a function parameter
(in C you can't pass arrays directly like a struct but in Ada
you can).  This eliminates a buffer overflow in the ABI generated
code in the testcase.

Added:
    dragonegg/trunk/test/validator/ada/abi_overflow.adb
    dragonegg/trunk/test/validator/ada/abi_overflow.ads
Modified:
    dragonegg/trunk/src/DefaultABI.cpp

Modified: dragonegg/trunk/src/DefaultABI.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/DefaultABI.cpp?rev=163786&r1=163785&r2=163786&view=diff
==============================================================================
--- dragonegg/trunk/src/DefaultABI.cpp (original)
+++ dragonegg/trunk/src/DefaultABI.cpp Thu Sep 13 05:47:14 2012
@@ -434,13 +434,12 @@
   StructType *STy = StructType::get(getGlobalContext(), Elts, false);
 
   unsigned Size = getTargetData().getTypeAllocSize(STy);
-  StructType *InSTy = dyn_cast<StructType>(Ty);
   unsigned InSize = 0;
   // If Ty and STy size does not match then last element is accessing
   // extra bits.
   unsigned LastEltSizeDiff = 0;
-  if (InSTy) {
-    InSize = getTargetData().getTypeAllocSize(InSTy);
+  if (isa<StructType>(Ty) || isa<ArrayType>(Ty)) {
+    InSize = getTargetData().getTypeAllocSize(Ty);
     if (InSize < Size) {
       unsigned N = STy->getNumElements();
       llvm::Type *LastEltTy = STy->getElementType(N-1);

Added: dragonegg/trunk/test/validator/ada/abi_overflow.adb
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/ada/abi_overflow.adb?rev=163786&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/ada/abi_overflow.adb (added)
+++ dragonegg/trunk/test/validator/ada/abi_overflow.adb Thu Sep 13 05:47:14 2012
@@ -0,0 +1,10 @@
+-- RUN: %dragonegg -S -O2 %s -o - | FileCheck %s
+
+package body ABI_Overflow is
+   procedure Foo (X : T) is
+-- CHECK: foo
+-- CHECK-NOT: store i64
+   begin
+      null;
+   end;
+end;

Added: dragonegg/trunk/test/validator/ada/abi_overflow.ads
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/ada/abi_overflow.ads?rev=163786&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/ada/abi_overflow.ads (added)
+++ dragonegg/trunk/test/validator/ada/abi_overflow.ads Thu Sep 13 05:47:14 2012
@@ -0,0 +1,5 @@
+-- RUN: true
+package ABI_Overflow is
+   type T is array (1 .. 3) of Character;
+   procedure Foo (X : T);
+end;





More information about the llvm-commits mailing list