Objective-C @synthesize support.
 - Only supports simple assignment and atomic semantics are ignored.
 - Not quite usable yet because the methods do not actually get added
   to the class metadata.
 - Added ObjCPropertyDecl::getSetterKind (one of Assign, Copy, Retain).
 - Rearrange CodeGenFunction so synthesis can reuse function prolog /
   epilog code.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55365 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 11fde87..909486a 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -62,19 +62,15 @@
     !T->isVoidType() && !T->isVectorType() && !T->isFunctionType();
 }
 
-void CodeGenFunction::GenerateFunction(const Stmt *Body) {
-  // Emit the function body.
-  EmitStmt(Body);
-
+void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
   // Finish emission of indirect switches.
   EmitIndirectSwitches();
 
   // Emit debug descriptor for function end.
   CGDebugInfo *DI = CGM.getDebugInfo(); 
   if (DI) {
-    const CompoundStmt* s = dyn_cast<CompoundStmt>(Body);
-    if (s && s->getRBracLoc().isValid()) {
-      DI->setLocation(s->getRBracLoc());
+    if (EndLoc.isValid()) {
+      DI->setLocation(EndLoc);
     }
     DI->EmitRegionEnd(CurFn, Builder);
   }
@@ -156,7 +152,15 @@
       EmitParmDecl(*CurParam, V);
     }
   }
-  GenerateFunction(FD->getBody());
+
+  EmitStmt(FD->getBody());
+  
+  const CompoundStmt *S = dyn_cast<CompoundStmt>(FD->getBody());
+  if (S) {
+    FinishFunction(S->getRBracLoc());
+  } else {
+    FinishFunction();
+  }
 }
 
 /// isDummyBlock - Return true if BB is an empty basic block