mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-05 13:26:55 +00:00
Adding a collector name attribute to Function in the IR. These
methods are new to Function: bool hasCollector() const; const std::string &getCollector() const; void setCollector(const std::string &); void clearCollector(); The assembly representation is as such: define void @f() gc "shadow-stack" { ... The implementation uses an on-the-side table to map Functions to collector names, such that there is no overhead. A StringPool is further used to unique collector names, which are extremely likely to be unique per process. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44769 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -282,6 +282,8 @@ external is_intrinsic : llvalue -> bool = "llvm_is_intrinsic"
|
||||
external function_call_conv : llvalue -> int = "llvm_function_call_conv"
|
||||
external set_function_call_conv : int -> llvalue -> unit
|
||||
= "llvm_set_function_call_conv"
|
||||
external collector : llvalue -> string option = "llvm_collector"
|
||||
external set_collector : string option -> llvalue -> unit = "llvm_set_collector"
|
||||
|
||||
(* TODO: param attrs *)
|
||||
|
||||
|
@@ -754,6 +754,15 @@ external function_call_conv : llvalue -> int = "llvm_function_call_conv"
|
||||
external set_function_call_conv : int -> llvalue -> unit
|
||||
= "llvm_set_function_call_conv"
|
||||
|
||||
(** [collector f] returns [Some name] if the function [f] has a garbage
|
||||
collection algorithm specified and [None] otherwise.
|
||||
See the method [llvm::Function::getCollector]. **)
|
||||
external collector : llvalue -> string option = "llvm_collector"
|
||||
|
||||
(** [set_collector gc f] sets the collection algorithm for the function [f] to
|
||||
[gc]. See the method [llvm::Function::setCollector]. **)
|
||||
external set_collector : string option -> llvalue -> unit = "llvm_set_collector"
|
||||
|
||||
(*--... Operations on basic blocks .........................................--*)
|
||||
|
||||
(** [basic_blocks fn] returns the basic blocks of the function [f].
|
||||
|
@@ -536,6 +536,29 @@ CAMLprim value llvm_set_function_call_conv(value Id, LLVMValueRef Fn) {
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/* llvalue -> string option */
|
||||
CAMLprim value llvm_collector(LLVMValueRef Fn) {
|
||||
const char *Collector;
|
||||
CAMLparam0();
|
||||
CAMLlocal2(Name, Option);
|
||||
|
||||
if ((Collector = LLVMGetCollector(Fn))) {
|
||||
Name = copy_string(Collector);
|
||||
|
||||
Option = alloc(1, 0);
|
||||
Field(Option, 0) = Name;
|
||||
CAMLreturn(Option);
|
||||
} else {
|
||||
CAMLreturn(Val_int(0));
|
||||
}
|
||||
}
|
||||
|
||||
/* string option -> llvalue -> unit */
|
||||
CAMLprim value llvm_set_collector(value GC, LLVMValueRef Fn) {
|
||||
LLVMSetCollector(Fn, GC == Val_int(0)? 0 : String_val(Field(GC, 0)));
|
||||
return Val_unit;
|
||||
}
|
||||
|
||||
/*--... Operations on basic blocks .........................................--*/
|
||||
|
||||
/* llvalue -> llbasicblock array */
|
||||
|
Reference in New Issue
Block a user