c6f55f7478
server is started. When the incremental compiler is used it accumulates state that increases the footprint of the process. This state is needed only when the 'reload' or 'expression evaluation' functionality is used in the debugger. Currently in the VM we do not have a good way of detecting when the debugger will be used as the vm service observatory functionality can be turned on dynamically after the program has started. This CL turns on the incremental compiler only when command line options are used to start the observatory server. We could run into issues with 'expression evaluation' when the observatory is started dynamically after the program is loaded. Change-Id: I18c17698622071bca428018f7fdac1a84b0f195e Reviewed-on: https://dart-review.googlesource.com/64667 Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Siva Annamalai <asiva@google.com>
126 lines
4.3 KiB
C++
126 lines
4.3 KiB
C++
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef RUNTIME_BIN_DFE_H_
|
|
#define RUNTIME_BIN_DFE_H_
|
|
|
|
#include "include/dart_api.h"
|
|
#include "include/dart_native_api.h"
|
|
#include "platform/assert.h"
|
|
#include "platform/globals.h"
|
|
|
|
namespace dart {
|
|
namespace bin {
|
|
|
|
class DFE {
|
|
public:
|
|
DFE();
|
|
~DFE();
|
|
|
|
// Call Init before Dart_Initialize to prevent races between the
|
|
// different isolates.
|
|
void Init();
|
|
|
|
char* frontend_filename() const { return frontend_filename_; }
|
|
|
|
void set_frontend_filename(const char* name) {
|
|
if (frontend_filename_ != NULL) {
|
|
free(frontend_filename_);
|
|
}
|
|
frontend_filename_ = strdup(name);
|
|
set_use_dfe();
|
|
}
|
|
void set_use_dfe(bool value = true) { use_dfe_ = value; }
|
|
bool UseDartFrontend() const { return use_dfe_; }
|
|
|
|
void set_use_incremental_compiler(bool value) {
|
|
use_incremental_compiler_ = value;
|
|
}
|
|
bool use_incremental_compiler() const { return use_incremental_compiler_; }
|
|
|
|
// Returns the platform binary file name if the path to
|
|
// kernel binaries was set using SetKernelBinaries.
|
|
const char* GetPlatformBinaryFilename();
|
|
|
|
// Set the kernel program for the main application if it was specified
|
|
// as a dill file.
|
|
void set_application_kernel_buffer(uint8_t* buffer, intptr_t size) {
|
|
application_kernel_buffer_ = buffer;
|
|
application_kernel_buffer_size_ = size;
|
|
}
|
|
void application_kernel_buffer(const uint8_t** buffer, intptr_t* size) const {
|
|
*buffer = application_kernel_buffer_;
|
|
*size = application_kernel_buffer_size_;
|
|
}
|
|
|
|
// Compiles specified script.
|
|
// Returns result from compiling the script.
|
|
Dart_KernelCompilationResult CompileScript(const char* script_uri,
|
|
bool strong,
|
|
bool incremental,
|
|
const char* package_config);
|
|
|
|
// Compiles specified script and reads the resulting kernel file.
|
|
// If the compilation is successful, returns a valid in memory kernel
|
|
// representation of the script, NULL otherwise
|
|
// 'error' and 'exit_code' have the error values in case of errors.
|
|
void CompileAndReadScript(const char* script_uri,
|
|
uint8_t** kernel_buffer,
|
|
intptr_t* kernel_buffer_size,
|
|
char** error,
|
|
int* exit_code,
|
|
bool strong,
|
|
const char* package_config);
|
|
|
|
// Reads the script kernel file if specified 'script_uri' is a kernel file.
|
|
// Returns an in memory kernel representation of the specified script is a
|
|
// valid kernel file, false otherwise.
|
|
void ReadScript(const char* script_uri,
|
|
uint8_t** kernel_buffer,
|
|
intptr_t* kernel_buffer_size) const;
|
|
|
|
static bool KernelServiceDillAvailable();
|
|
|
|
// Tries to read [script_uri] as a Kernel IR file.
|
|
// Returns `true` if successful and sets [kernel_file] and [kernel_length]
|
|
// to be the kernel IR contents.
|
|
// The caller is responsible for free()ing [kernel_file] if `true`
|
|
// was returned.
|
|
static bool TryReadKernelFile(const char* script_uri,
|
|
uint8_t** kernel_buffer,
|
|
intptr_t* kernel_buffer_size);
|
|
|
|
// We distinguish between "intent to use Dart frontend" vs "can actually
|
|
// use Dart frontend". The method UseDartFrontend tells us about the
|
|
// intent to use DFE. This method tells us if Dart frontend can actually
|
|
// be used.
|
|
bool CanUseDartFrontend() const;
|
|
|
|
void LoadPlatform(const uint8_t** kernel_buffer,
|
|
intptr_t* kernel_buffer_size,
|
|
bool strong = false);
|
|
void LoadKernelService(const uint8_t** kernel_service_buffer,
|
|
intptr_t* kernel_service_buffer_size);
|
|
|
|
private:
|
|
bool use_dfe_;
|
|
bool use_incremental_compiler_;
|
|
char* frontend_filename_;
|
|
|
|
// Kernel binary specified on the cmd line.
|
|
uint8_t* application_kernel_buffer_;
|
|
intptr_t application_kernel_buffer_size_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(DFE);
|
|
};
|
|
|
|
#if !defined(DART_PRECOMPILED_RUNTIME)
|
|
extern DFE dfe;
|
|
#endif
|
|
|
|
} // namespace bin
|
|
} // namespace dart
|
|
|
|
#endif // RUNTIME_BIN_DFE_H_
|