Get a [Signature] for the function targeted by this [LibCall].
(&self, call_conv: CallConv, pointer_type: Type)
| 126 | |
| 127 | /// Get a [Signature] for the function targeted by this [LibCall]. |
| 128 | pub fn signature(&self, call_conv: CallConv, pointer_type: Type) -> Signature { |
| 129 | use types::*; |
| 130 | let mut sig = Signature::new(call_conv); |
| 131 | |
| 132 | match self { |
| 133 | LibCall::CeilF32 | LibCall::FloorF32 | LibCall::TruncF32 | LibCall::NearestF32 => { |
| 134 | sig.params.push(AbiParam::new(F32)); |
| 135 | sig.returns.push(AbiParam::new(F32)); |
| 136 | } |
| 137 | LibCall::TruncF64 | LibCall::FloorF64 | LibCall::CeilF64 | LibCall::NearestF64 => { |
| 138 | sig.params.push(AbiParam::new(F64)); |
| 139 | sig.returns.push(AbiParam::new(F64)); |
| 140 | } |
| 141 | LibCall::FmaF32 | LibCall::FmaF64 => { |
| 142 | let ty = if *self == LibCall::FmaF32 { F32 } else { F64 }; |
| 143 | |
| 144 | sig.params.push(AbiParam::new(ty)); |
| 145 | sig.params.push(AbiParam::new(ty)); |
| 146 | sig.params.push(AbiParam::new(ty)); |
| 147 | sig.returns.push(AbiParam::new(ty)); |
| 148 | } |
| 149 | LibCall::Memcpy | LibCall::Memmove => { |
| 150 | // void* memcpy(void *dest, const void *src, size_t count); |
| 151 | // void* memmove(void* dest, const void* src, size_t count); |
| 152 | sig.params.push(AbiParam::new(pointer_type)); |
| 153 | sig.params.push(AbiParam::new(pointer_type)); |
| 154 | sig.params.push(AbiParam::new(pointer_type)); |
| 155 | sig.returns.push(AbiParam::new(pointer_type)); |
| 156 | } |
| 157 | LibCall::Memset => { |
| 158 | // void *memset(void *dest, int ch, size_t count); |
| 159 | sig.params.push(AbiParam::new(pointer_type)); |
| 160 | sig.params.push(AbiParam::new(I32)); |
| 161 | sig.params.push(AbiParam::new(pointer_type)); |
| 162 | sig.returns.push(AbiParam::new(pointer_type)); |
| 163 | } |
| 164 | LibCall::Memcmp => { |
| 165 | // void* memcpy(void *dest, const void *src, size_t count); |
| 166 | sig.params.push(AbiParam::new(pointer_type)); |
| 167 | sig.params.push(AbiParam::new(pointer_type)); |
| 168 | sig.params.push(AbiParam::new(pointer_type)); |
| 169 | sig.returns.push(AbiParam::new(I32)) |
| 170 | } |
| 171 | |
| 172 | LibCall::Probestack | LibCall::ElfTlsGetAddr | LibCall::ElfTlsGetOffset => { |
| 173 | unimplemented!() |
| 174 | } |
| 175 | LibCall::X86Pshufb => { |
| 176 | sig.params.push(AbiParam::new(I8X16)); |
| 177 | sig.params.push(AbiParam::new(I8X16)); |
| 178 | sig.returns.push(AbiParam::new(I8X16)); |
| 179 | } |
| 180 | } |
| 181 | |
| 182 | sig |
| 183 | } |
| 184 | } |
| 185 |
no test coverage detected