Skip to content
  1. Jul 30, 2010
  2. Jul 29, 2010
    • Argyrios Kyrtzidis's avatar
      Weak references and variables that are not definitions are not required for... · 6e03a747
      Argyrios Kyrtzidis authored
      Weak references and variables that are not definitions are not required for early codegen/deserialization.
      
      llvm-svn: 109796
      6e03a747
    • Argyrios Kyrtzidis's avatar
      Implement PCH support for offsetof(base-specifier). · d67d4cc8
      Argyrios Kyrtzidis authored
      llvm-svn: 109785
      d67d4cc8
    • Argyrios Kyrtzidis's avatar
      Merge PCHWriterDecl.cpp's isRequiredDecl and CodeGenModule::MayDeferGeneration into a new function, · c81af03f
      Argyrios Kyrtzidis authored
      DeclIsRequiredFunctionOrFileScopedVar.
      
      This is essentially a CodeGen predicate that is also needed by the PCH mechanism to determine whether a decl
      needs to be deserialized during PCH loading for codegen purposes.
      Since this logic is shared by CodeGen and the PCH mechanism, move it to the ASTContext,
      thus CodeGenModule's GetLinkageForFunction/GetLinkageForVariable and the GVALinkage enum is moved out of CodeGen.
      
      This fixes current (and avoids future) codegen-from-PCH bugs.
      
      llvm-svn: 109784
      c81af03f
    • Chris Lattner's avatar
      fix rdar://8251384, another case where we could access beyond the · 7f4b81af
      Chris Lattner authored
      end of a struct.  This improves the case when the struct being passed
      contains 3 floats, either due to a struct or array of 3 things.  Before
      we'd generate this IR for the testcase:
      
      define float @bar(double %X.coerce0, double %X.coerce1) nounwind {
      entry:
        %X = alloca %struct.foof, align 8               ; <%struct.foof*> [#uses=2]
        %0 = bitcast %struct.foof* %X to %1*            ; <%1*> [#uses=2]
        %1 = getelementptr %1* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %X.coerce0, double* %1
        %2 = getelementptr %1* %0, i32 0, i32 1         ; <double*> [#uses=1]
        store double %X.coerce1, double* %2
        %tmp = getelementptr inbounds %struct.foof* %X, i32 0, i32 2 ; <float*> [#uses=1]
        %tmp1 = load float* %tmp                        ; <float> [#uses=1]
        ret float %tmp1
      }
      
      which compiled (with optimization) to:
      
      _bar:                                   ## @bar
      ## BB#0:                                ## %entry
      	movd	%xmm1, %rax
      	movd	%eax, %xmm0
      	ret
      
      Now we produce:
      
      define float @bar(double %X.coerce0, float %X.coerce1) nounwind {
      entry:
        %X = alloca %struct.foof, align 8               ; <%struct.foof*> [#uses=2]
        %0 = bitcast %struct.foof* %X to %0*            ; <%0*> [#uses=2]
        %1 = getelementptr %0* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %X.coerce0, double* %1
        %2 = getelementptr %0* %0, i32 0, i32 1         ; <float*> [#uses=1]
        store float %X.coerce1, float* %2
        %tmp = getelementptr inbounds %struct.foof* %X, i32 0, i32 2 ; <float*> [#uses=1]
        %tmp1 = load float* %tmp                        ; <float> [#uses=1]
        ret float %tmp1
      }
      
      and:
      
      _bar:                                   ## @bar
      ## BB#0:                                ## %entry
      	movaps	%xmm1, %xmm0
      	ret
      
      llvm-svn: 109776
      7f4b81af
    • Chris Lattner's avatar
      handle a case where we could access off the end of a function · 3f76342c
      Chris Lattner authored
      that Eli pointed out, rdar://8249586
      
      llvm-svn: 109762
      3f76342c
    • Chris Lattner's avatar
      in release mode, irbuilder doesn't add names to instructions, · 44f9c3b3
      Chris Lattner authored
      this will hopefully fix the osuosl clang-i686-darwin10 builder.
      
      llvm-svn: 109760
      44f9c3b3
    • Chris Lattner's avatar
      fix PR7742 / rdar://8250764, a miscompilation of struct · cd84084f
      Chris Lattner authored
      return where the struct has a base but no fields.  This
      was because the x86-64 abi logic was checking the wrong
      predicate in one place.
      
      This was introduced in r91874, which was a fix for PR5831,
      which lacked a CHECK line, so I verified and added it.
      
      llvm-svn: 109759
      cd84084f
    • Fariborz Jahanian's avatar
      Tigthen the condition for issung ivar shadowing · c15dfd8a
      Fariborz Jahanian authored
      variables to those in file scope (nonfragile-abi2).
      Fixes radar 8248681.
      
      llvm-svn: 109758
      c15dfd8a
    • Douglas Gregor's avatar
      When taking the address of a value of Objective-C object type (e.g., · 0bdcb8a2
      Douglas Gregor authored
      one because we're referencing a variable of type NSString &), the
      resulting type is an ObjCObjectPointerType.
      
      llvm-svn: 109753
      0bdcb8a2
    • Douglas Gregor's avatar
      Allow a looser form of compatibility checking (which ignores · 17ea3f5d
      Douglas Gregor authored
      qualifiers) when checking a K&R function definition against a previous
      prototype. Fixes <rdar://problem/8193107>.
      
      llvm-svn: 109751
      17ea3f5d
    • Douglas Gregor's avatar
      When deleting a value of class type, make sure that type is complete · f65f490a
      Douglas Gregor authored
      before looking for conversions to pointer type. Fixes <rdar://problem/8248780>.
      
      llvm-svn: 109749
      f65f490a
    • Douglas Gregor's avatar
      Reword the empty struct/union warning in C to note that such structs and... · da2955ed
      Douglas Gregor authored
      Reword the empty struct/union warning in C to note that such structs and unions have size 0 in C, size 1 in C++. Put this warning under -Wc++-compat.
      
      llvm-svn: 109748
      da2955ed
    • Chris Lattner's avatar
      This is a little bit far, but optimize cases like: · 98076a25
      Chris Lattner authored
      struct a {
        struct c {
          double x;
          int y;
        } x[1];
      };
      
      void foo(struct a A) {
      }
      
      into:
      
      define void @foo(double %A.coerce0, i32 %A.coerce1) nounwind {
      entry:
        %A = alloca %struct.a, align 8                  ; <%struct.a*> [#uses=1]
        %0 = bitcast %struct.a* %A to %struct.c*        ; <%struct.c*> [#uses=2]
        %1 = getelementptr %struct.c* %0, i32 0, i32 0  ; <double*> [#uses=1]
        store double %A.coerce0, double* %1
        %2 = getelementptr %struct.c* %0, i32 0, i32 1  ; <i32*> [#uses=1]
        store i32 %A.coerce1, i32* %2
      
      instead of:
      
      define void @foo(double %A.coerce0, i64 %A.coerce1) nounwind {
      entry:
        %A = alloca %struct.a, align 8                  ; <%struct.a*> [#uses=1]
        %0 = bitcast %struct.a* %A to %0*               ; <%0*> [#uses=2]
        %1 = getelementptr %0* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %A.coerce0, double* %1
        %2 = getelementptr %0* %0, i32 0, i32 1         ; <i64*> [#uses=1]
        store i64 %A.coerce1, i64* %2
      
      I only do this now because I never want to look at this code again :)
       
      
      llvm-svn: 109738
      98076a25
    • Chris Lattner's avatar
      implement a todo: pass a eight-byte that consists of a · c8b7b53a
      Chris Lattner authored
      small integer + padding as that small integer.  On code
      like:
      
      struct c { double x; int y; };
      void bar(struct c C) { }
      
      This means that we compile to:
      
      define void @bar(double %C.coerce0, i32 %C.coerce1) nounwind {
      entry:
        %C = alloca %struct.c, align 8                  ; <%struct.c*> [#uses=2]
        %0 = getelementptr %struct.c* %C, i32 0, i32 0  ; <double*> [#uses=1]
        store double %C.coerce0, double* %0
        %1 = getelementptr %struct.c* %C, i32 0, i32 1  ; <i32*> [#uses=1]
        store i32 %C.coerce1, i32* %1
      
      instead of:
      
      define void @bar(double %C.coerce0, i64 %C.coerce1) nounwind {
      entry:
        %C = alloca %struct.c, align 8                  ; <%struct.c*> [#uses=3]
        %0 = bitcast %struct.c* %C to %0*               ; <%0*> [#uses=2]
        %1 = getelementptr %0* %0, i32 0, i32 0         ; <double*> [#uses=1]
        store double %C.coerce0, double* %1
        %2 = getelementptr %0* %0, i32 0, i32 1         ; <i64*> [#uses=1]
        store i64 %C.coerce1, i64* %2
      
      which gives SRoA heartburn.
      
      This implements rdar://5711709, a nice low number :)
      
      llvm-svn: 109737
      c8b7b53a
    • Jordy Rose's avatar
      Move new test (that requires RegionStore) into its own file. · 23f0f4b7
      Jordy Rose authored
      llvm-svn: 109736
      23f0f4b7
    • Jordy Rose's avatar
      Use a LazyCompoundVal to handle initialization with a string literal, rather... · daa1c834
      Jordy Rose authored
      Use a LazyCompoundVal to handle initialization with a string literal, rather than copying each character.
      
      llvm-svn: 109734
      daa1c834
    • Chris Lattner's avatar
      Kill off the 'coerce' ABI passing form. Now 'direct' and 'extend' always · fe34c1d5
      Chris Lattner authored
      have a "coerce to" type which often matches the default lowering of Clang
      type to LLVM IR type, but the coerce case can be handled by making them
      not be the same.
      
      This simplifies things and fixes issues where X86-64 abi lowering would 
      return coerce after making preferred types exactly match up.  This caused
      us to compile:
      
      typedef float v4f32 __attribute__((__vector_size__(16)));
      v4f32 foo(v4f32 X) {
        return X+X;
      }
      
      into this code at -O0:
      
      define <4 x float> @foo(<4 x float> %X.coerce) nounwind {
      entry:
        %retval = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=2]
        %coerce = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=2]
        %X.addr = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=3]
        store <4 x float> %X.coerce, <4 x float>* %coerce
        %X = load <4 x float>* %coerce                  ; <<4 x float>> [#uses=1]
        store <4 x float> %X, <4 x float>* %X.addr
        %tmp = load <4 x float>* %X.addr                ; <<4 x float>> [#uses=1]
        %tmp1 = load <4 x float>* %X.addr               ; <<4 x float>> [#uses=1]
        %add = fadd <4 x float> %tmp, %tmp1             ; <<4 x float>> [#uses=1]
        store <4 x float> %add, <4 x float>* %retval
        %0 = load <4 x float>* %retval                  ; <<4 x float>> [#uses=1]
        ret <4 x float> %0
      }
      
      Now we get:
      
      define <4 x float> @foo(<4 x float> %X) nounwind {
      entry:
        %X.addr = alloca <4 x float>, align 16          ; <<4 x float>*> [#uses=3]
        store <4 x float> %X, <4 x float>* %X.addr
        %tmp = load <4 x float>* %X.addr                ; <<4 x float>> [#uses=1]
        %tmp1 = load <4 x float>* %X.addr               ; <<4 x float>> [#uses=1]
        %add = fadd <4 x float> %tmp, %tmp1             ; <<4 x float>> [#uses=1]
        ret <4 x float> %add
      }
      
      This implements rdar://8248065
      
      llvm-svn: 109733
      fe34c1d5
    • Chris Lattner's avatar
      ignore structs that wrap vectors in IR, the abstraction shouldn't add penalty. · 9fa15c36
      Chris Lattner authored
      Before we'd compile the example into something like:
      
        %coerce.dive2 = getelementptr %struct.v4f32wrapper* %retval, i32 0, i32 0 ; <<4 x float>*> [#uses=1]
        %1 = bitcast <4 x float>* %coerce.dive2 to <2 x double>* ; <<2 x double>*> [#uses=1]
        %2 = load <2 x double>* %1, align 1             ; <<2 x double>> [#uses=1]
        ret <2 x double> %2
      
      Now we produce:
      
        %coerce.dive2 = getelementptr %struct.v4f32wrapper* %retval, i32 0, i32 0 ; <<4 x float>*> [#uses=1]
        %0 = load <4 x float>* %coerce.dive2, align 1   ; <<4 x float>> [#uses=1]
        ret <4 x float> %0
      
      llvm-svn: 109732
      9fa15c36
    • Chris Lattner's avatar
      move the 'pretty 16-byte vector' inferring code up to be shared · 4200fe4e
      Chris Lattner authored
      with return values, improving stuff that returns __m128 etc.
      
      llvm-svn: 109731
      4200fe4e
    • Chris Lattner's avatar
      now that we have CGT around, we can start using preferred types · 3a44c7e5
      Chris Lattner authored
      for return values too.  Instead of compiling something like:
      
      struct foo {
        int *X;
        float *Y;
      };
      
      struct foo test(struct foo *P) { return *P; }
      
      to:
      
      %1 = type { i64, i64 }
      
      define %1 @test(%struct.foo* %P) nounwind {
      entry:
        %retval = alloca %struct.foo, align 8           ; <%struct.foo*> [#uses=2]
        %P.addr = alloca %struct.foo*, align 8          ; <%struct.foo**> [#uses=2]
        store %struct.foo* %P, %struct.foo** %P.addr
        %tmp = load %struct.foo** %P.addr               ; <%struct.foo*> [#uses=1]
        %tmp1 = bitcast %struct.foo* %retval to i8*     ; <i8*> [#uses=1]
        %tmp2 = bitcast %struct.foo* %tmp to i8*        ; <i8*> [#uses=1]
        call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp1, i8* %tmp2, i64 16, i32 8, i1 false)
        %0 = bitcast %struct.foo* %retval to %1*        ; <%1*> [#uses=1]
        %1 = load %1* %0, align 1                       ; <%1> [#uses=1]
        ret %1 %1
      }
      
      We now get the result more type safe, with:
      
      define %struct.foo @test(%struct.foo* %P) nounwind {
      entry:
        %retval = alloca %struct.foo, align 8           ; <%struct.foo*> [#uses=2]
        %P.addr = alloca %struct.foo*, align 8          ; <%struct.foo**> [#uses=2]
        store %struct.foo* %P, %struct.foo** %P.addr
        %tmp = load %struct.foo** %P.addr               ; <%struct.foo*> [#uses=1]
        %tmp1 = bitcast %struct.foo* %retval to i8*     ; <i8*> [#uses=1]
        %tmp2 = bitcast %struct.foo* %tmp to i8*        ; <i8*> [#uses=1]
        call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp1, i8* %tmp2, i64 16, i32 8, i1 false)
        %0 = load %struct.foo* %retval                  ; <%struct.foo> [#uses=1]
        ret %struct.foo %0
      }
      
      That memcpy is completely terrible, but I don't know how to fix it.
      
      llvm-svn: 109729
      3a44c7e5
    • Ted Kremenek's avatar
      Teach GRExprEngine::VisitLValue() about FloatingLiteral, ImaginaryLiteral, and... · 8bedb7dd
      Ted Kremenek authored
      Teach GRExprEngine::VisitLValue() about FloatingLiteral, ImaginaryLiteral, and CharacterLiteral.  Fixes an assertion failure reported in PR 7675.
      
      llvm-svn: 109719
      8bedb7dd
    • Ted Kremenek's avatar
      Augment RegionStore::BindStruct() to bind symbolicated struct values. This... · 385f71b1
      Ted Kremenek authored
      Augment RegionStore::BindStruct() to bind symbolicated struct values.  This fixes a false path issue reported in <rdar://problem/8243408> and also spurs another cause where the idempotent operations checker fires.
      
      llvm-svn: 109710
      385f71b1
    • Douglas Gregor's avatar
      Visit the children of CXXOperatorCallExprs in source order within · b59d21c2
      Douglas Gregor authored
      libclang, so that clang_annotateTokens() doesn't get confused and miss
      annotations.
      
      llvm-svn: 109706
      b59d21c2
    • Douglas Gregor's avatar
      Don't set out-of-line template specialization/definition information · 43397fc4
      Douglas Gregor authored
      for AST nodes that aren't actually out-of-line (i.e., require a
      nested-name-specifier). Fixes <rdar://problem/8204126>.
      
      llvm-svn: 109704
      43397fc4
    • Chris Lattner's avatar
      pass argument vectors in a type that corresponds to the user type if · f4ba08ae
      Chris Lattner authored
      possible.  This improves the example to pass <4 x float> instead of
      <2 x double> but we still get awful code, and still don't get the
      return value right.
      
      llvm-svn: 109700
      f4ba08ae
    • Fariborz Jahanian's avatar
      Initialize block's imported variable(s) in · e6a4e393
      Fariborz Jahanian authored
      block's synthesized constructor initalizer list.
      Fixes radar 8240371.
      
      llvm-svn: 109698
      e6a4e393
    • Eli Friedman's avatar
      PR7736: Make sure to mark &Class::Member correctly as being type-dependent · 89eb5def
      Eli Friedman authored
      inside a template class.
      
      llvm-svn: 109697
      89eb5def
    • Chris Lattner's avatar
      use Get8ByteTypeAtOffset for the return value path as well so we · 31faff5d
      Chris Lattner authored
      don't get errors similar to PR7714 on the return path.
      
      llvm-svn: 109689
      31faff5d
    • Douglas Gregor's avatar
      Don't die when a member access refers to a non-class member via a · a9c3e827
      Douglas Gregor authored
      qualified name. Fixes <rdar://problem/8231724>.
      
      llvm-svn: 109682
      a9c3e827
    • Chris Lattner's avatar
      fix PR7714 by not referencing off the end of a struct when passed by value in · 4c1e484f
      Chris Lattner authored
      x86-64 abi.  This also improves codegen as well.  Some refactoring is needed of
      this code.
      
      llvm-svn: 109681
      4c1e484f
Loading