handle_expression_category.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #include "toolchain/lower/function_context.h"
  5. namespace Carbon::Lower {
  6. auto HandleBindValue(FunctionContext& context, SemIR::NodeId node_id,
  7. SemIR::Node node) -> void {
  8. switch (auto rep = SemIR::GetValueRepresentation(context.semantics_ir(),
  9. node.type_id());
  10. rep.kind) {
  11. case SemIR::ValueRepresentation::None:
  12. // Nothing should use this value, but StubReference needs a value to
  13. // propagate.
  14. context.SetLocal(node_id,
  15. llvm::PoisonValue::get(context.GetType(node.type_id())));
  16. break;
  17. case SemIR::ValueRepresentation::Copy:
  18. context.SetLocal(node_id, context.builder().CreateLoad(
  19. context.GetType(node.type_id()),
  20. context.GetLocal(node.GetAsBindValue())));
  21. break;
  22. case SemIR::ValueRepresentation::Pointer:
  23. context.SetLocal(node_id, context.GetLocal(node.GetAsBindValue()));
  24. break;
  25. case SemIR::ValueRepresentation::Custom:
  26. CARBON_FATAL() << "TODO: Add support for BindValue with custom value rep";
  27. }
  28. }
  29. auto HandleTemporary(FunctionContext& context, SemIR::NodeId node_id,
  30. SemIR::Node node) -> void {
  31. auto [temporary_id, init_id] = node.GetAsTemporary();
  32. context.FinishInitialization(node.type_id(), temporary_id, init_id);
  33. context.SetLocal(node_id, context.GetLocal(temporary_id));
  34. }
  35. auto HandleTemporaryStorage(FunctionContext& context, SemIR::NodeId node_id,
  36. SemIR::Node node) -> void {
  37. context.SetLocal(
  38. node_id, context.builder().CreateAlloca(context.GetType(node.type_id()),
  39. nullptr, "temp"));
  40. }
  41. } // namespace Carbon::Lower