tbaeder created this revision.
tbaeder added reviewers: aaron.ballman, erichkeane, tahonermann, shafik.
Herald added a project: All.
tbaeder requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

  'Params' is a member of the ByteCodeEmitter. We only added the
  parameters the first time  we saw the function, so subsequent visits
  didn't work if they had (and used) parameters.
  
  Just do the work everytime we see a function.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D141681

Files:
  clang/lib/AST/Interp/ByteCodeEmitter.cpp
  clang/test/AST/Interp/functions.cpp

Index: clang/test/AST/Interp/functions.cpp
===================================================================
--- clang/test/AST/Interp/functions.cpp
+++ clang/test/AST/Interp/functions.cpp
@@ -163,3 +163,8 @@
     return true;
   }
 };
+
+constexpr int nyd(int m);
+constexpr int doit() { return nyd(10); }
+constexpr int nyd(int m) { return m; }
+static_assert(doit() == 10);
Index: clang/lib/AST/Interp/ByteCodeEmitter.cpp
===================================================================
--- clang/lib/AST/Interp/ByteCodeEmitter.cpp
+++ clang/lib/AST/Interp/ByteCodeEmitter.cpp
@@ -21,51 +21,50 @@
 
 Expected<Function *>
 ByteCodeEmitter::compileFunc(const FunctionDecl *FuncDecl) {
-  // Create a handle over the emitted code.
-  Function *Func = P.getFunction(FuncDecl);
-  if (!Func) {
-    // Set up argument indices.
-    unsigned ParamOffset = 0;
-    SmallVector<PrimType, 8> ParamTypes;
-    llvm::DenseMap<unsigned, Function::ParamDescriptor> ParamDescriptors;
-
-    // If the return is not a primitive, a pointer to the storage where the
-    // value is initialized in is passed as the first argument. See 'RVO'
-    // elsewhere in the code.
-    QualType Ty = FuncDecl->getReturnType();
-    bool HasRVO = false;
-    if (!Ty->isVoidType() && !Ctx.classify(Ty)) {
-      HasRVO = true;
-      ParamTypes.push_back(PT_Ptr);
-      ParamOffset += align(primSize(PT_Ptr));
-    }
+  // Set up argument indices.
+  unsigned ParamOffset = 0;
+  SmallVector<PrimType, 8> ParamTypes;
+  llvm::DenseMap<unsigned, Function::ParamDescriptor> ParamDescriptors;
+
+  // If the return is not a primitive, a pointer to the storage where the
+  // value is initialized in is passed as the first argument. See 'RVO'
+  // elsewhere in the code.
+  QualType Ty = FuncDecl->getReturnType();
+  bool HasRVO = false;
+  if (!Ty->isVoidType() && !Ctx.classify(Ty)) {
+    HasRVO = true;
+    ParamTypes.push_back(PT_Ptr);
+    ParamOffset += align(primSize(PT_Ptr));
+  }
 
-    // If the function decl is a member decl, the next parameter is
-    // the 'this' pointer. This parameter is pop()ed from the
-    // InterpStack when calling the function.
-    bool HasThisPointer = false;
-    if (const auto *MD = dyn_cast<CXXMethodDecl>(FuncDecl);
-        MD && MD->isInstance()) {
-      HasThisPointer = true;
-      ParamTypes.push_back(PT_Ptr);
-      ParamOffset += align(primSize(PT_Ptr));
-    }
+  // If the function decl is a member decl, the next parameter is
+  // the 'this' pointer. This parameter is pop()ed from the
+  // InterpStack when calling the function.
+  bool HasThisPointer = false;
+  if (const auto *MD = dyn_cast<CXXMethodDecl>(FuncDecl);
+      MD && MD->isInstance()) {
+    HasThisPointer = true;
+    ParamTypes.push_back(PT_Ptr);
+    ParamOffset += align(primSize(PT_Ptr));
+  }
 
-    // Assign descriptors to all parameters.
-    // Composite objects are lowered to pointers.
-    for (const ParmVarDecl *PD : FuncDecl->parameters()) {
-      PrimType Ty = Ctx.classify(PD->getType()).value_or(PT_Ptr);
-      Descriptor *Desc = P.createDescriptor(PD, Ty);
-      ParamDescriptors.insert({ParamOffset, {Ty, Desc}});
-      Params.insert({PD, ParamOffset});
-      ParamOffset += align(primSize(Ty));
-      ParamTypes.push_back(Ty);
-    }
+  // Assign descriptors to all parameters.
+  // Composite objects are lowered to pointers.
+  for (const ParmVarDecl *PD : FuncDecl->parameters()) {
+    PrimType Ty = Ctx.classify(PD->getType()).value_or(PT_Ptr);
+    Descriptor *Desc = P.createDescriptor(PD, Ty);
+    ParamDescriptors.insert({ParamOffset, {Ty, Desc}});
+    Params.insert({PD, ParamOffset});
+    ParamOffset += align(primSize(Ty));
+    ParamTypes.push_back(Ty);
+  }
 
+  // Create a handle over the emitted code.
+  Function *Func = P.getFunction(FuncDecl);
+  if (!Func)
     Func =
         P.createFunction(FuncDecl, ParamOffset, std::move(ParamTypes),
                          std::move(ParamDescriptors), HasThisPointer, HasRVO);
-  }
 
   assert(Func);
   // For not-yet-defined functions, we only create a Function instance and
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to