Builtin.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #ifndef QLOW_SEM_BUILTIN_H
  2. #define QLOW_SEM_BUILTIN_H
  3. #include "Semantic.h"
  4. #include "Scope.h"
  5. #include <llvm/IR/Value.h>
  6. #include <llvm/IR/IRBuilder.h>
  7. namespace qlow
  8. {
  9. namespace sem
  10. {
  11. NativeScope generateNativeScope(void);
  12. struct NativeMethod;
  13. struct UnaryNativeMethod;
  14. struct BinaryNativeMethod;
  15. }
  16. }
  17. struct qlow::sem::NativeMethod : public sem::Method
  18. {
  19. inline NativeMethod(std::shared_ptr<Type> returnType) :
  20. Method{ NativeScope::getInstance(), std::move(returnType) }
  21. {
  22. }
  23. virtual llvm::Value* generateCode(llvm::IRBuilder<>& builder,
  24. std::vector<llvm::Value*> arguments) = 0;
  25. };
  26. struct qlow::sem::UnaryNativeMethod : public sem::NativeMethod
  27. {
  28. std::function<llvm::Value*(llvm::IRBuilder<>&, llvm::Value*)> generator;
  29. inline UnaryNativeMethod(std::shared_ptr<Type> returnType,
  30. const std::function
  31. <llvm::Value*(llvm::IRBuilder<>&, llvm::Value*)>& generator) :
  32. NativeMethod{ std::move(returnType) },
  33. generator{ generator }
  34. {
  35. }
  36. virtual llvm::Value* generateCode(llvm::IRBuilder<>& builder,
  37. std::vector<llvm::Value*> arguments);
  38. };
  39. struct qlow::sem::BinaryNativeMethod : public sem::NativeMethod
  40. {
  41. using Func =
  42. std::function<llvm::Value*(llvm::IRBuilder<>&, llvm::Value*, llvm::Value*)>;
  43. Func generator;
  44. Variable argument;
  45. inline BinaryNativeMethod(std::shared_ptr<Type> returnType,
  46. std::shared_ptr<Type> argumentType,
  47. Func&& generator) :
  48. NativeMethod{ std::move(returnType) },
  49. generator{ generator },
  50. argument{ std::move(argumentType), "arg" }
  51. {
  52. Method::arguments = { &argument };
  53. }
  54. virtual llvm::Value* generateCode(llvm::IRBuilder<>& builder,
  55. std::vector<llvm::Value*> arguments);
  56. };
  57. #endif // QLOW_SEM_BUILTIN_H