[Orc] Make the makeStub function propagate argument attributes onto the call to
the function body.

This is necessary for correctness when lazily compiling.

Also, flesh out the Orc unit test infrastructure slightly, and add a unit test
for this.

llvm-svn: 235347
diff --git a/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
new file mode 100644
index 0000000..3ae2ed8
--- /dev/null
+++ b/llvm/unittests/ExecutionEngine/Orc/OrcTestCommon.h
@@ -0,0 +1,65 @@
+//===------ OrcTestCommon.h - Utilities for Orc Unit Tests ------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Common utilities for the Orc unit tests.
+//
+//===----------------------------------------------------------------------===//
+
+
+#ifndef LLVM_UNITTESTS_EXECUTIONENGINE_ORC_ORCTESTCOMMON_H
+#define LLVM_UNITTESTS_EXECUTIONENGINE_ORC_ORCTESTCOMMON_H
+
+#include "llvm/IR/Function.h"
+#include "llvm/IR/IRBuilder.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/TypeBuilder.h"
+#include <memory>
+
+namespace llvm {
+
+  class ModuleBuilder {
+  public:
+    ModuleBuilder(LLVMContext &Context, StringRef Triple,
+                  StringRef Name);
+
+    template <typename FuncType>
+    Function* createFunctionDecl(Module *M, StringRef Name) {
+      return Function::Create(
+               TypeBuilder<FuncType, false>::get(M->getContext()),
+               GlobalValue::ExternalLinkage, Name, M);
+    }
+
+    Module* getModule() { return M.get(); }
+    const Module* getModule() const { return M.get(); }
+    std::unique_ptr<Module> takeModule() { return std::move(M); }
+
+  private:
+    std::unique_ptr<Module> M;
+    IRBuilder<> Builder;
+  };
+
+  // Dummy struct type.
+  struct DummyStruct {
+    int X[256];
+  };
+
+  // TypeBuilder specialization for DummyStruct.
+  template <bool XCompile>
+  class TypeBuilder<DummyStruct, XCompile> {
+  public:
+    static StructType *get(LLVMContext &Context) {
+      return StructType::get(TypeBuilder<types::i<32>[256], XCompile>::get(Context), NULL);
+    }
+  };
+
+
+} // namespace llvm
+
+#endif