| // Part of the Crubit project, under the Apache License v2.0 with LLVM |
| // Exceptions. See /LICENSE for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| #include <string> |
| |
| #include "absl/status/statusor.h" |
| #include "common/ffi_types.h" |
| #include "rs_bindings_from_cc/bazel_types.h" |
| #include "rs_bindings_from_cc/ir.h" |
| #include "rs_bindings_from_cc/ir_from_cc.h" |
| #include "llvm/Support/ErrorHandling.h" |
| #include "llvm/Support/FormatVariadic.h" |
| #include "llvm/Support/JSON.h" |
| |
| namespace crubit { |
| |
| // LINT.IfChange |
| static constexpr absl::string_view kDependencyTarget = "//test:dependency"; |
| |
| static constexpr absl::string_view kDependencyHeaderName = |
| "test/dependency_header.h"; |
| // LINT.ThenChange(//depot/rs_bindings_from_cc/ir_testing.rs) |
| |
| // This is intended to be called from Rust. |
| extern "C" FfiU8SliceBox json_from_cc_dependency( |
| FfiU8Slice header_source, FfiU8Slice dependency_header_source) { |
| absl::StatusOr<IR> ir = IrFromCc( |
| StringViewFromFfiU8Slice(header_source), |
| BazelLabel{"//test:testing_target"}, |
| /* public_headers= */ {}, |
| {{HeaderName(std::string(kDependencyHeaderName)), |
| std::string(StringViewFromFfiU8Slice(dependency_header_source))}}, |
| {{HeaderName(std::string(kDependencyHeaderName)), |
| BazelLabel{std::string(kDependencyTarget)}}}); |
| // TODO(forster): For now it is good enough to just exit: We are just using |
| // this from tests, which are ok to just fail. Clang has already printed error |
| // messages. If we start using this for production, then we should bridge the |
| // error code into Rust. |
| if (!ir.ok()) { |
| llvm::report_fatal_error(llvm::formatv("IrFromCc reported an error: {0}", |
| ir.status().message())); |
| } |
| std::string json = llvm::formatv("{0}", ir->ToJson()); |
| return AllocFfiU8SliceBox(MakeFfiU8Slice(json)); |
| } |
| |
| } // namespace crubit |