Эх сурвалжийг харах

Merge pull request #14 from seanyoung/opt

Add command line option to specify llvm optimizer level
Sean Young 6 жил өмнө
parent
commit
6006da6302
3 өөрчлөгдсөн 20 нэмэгдсэн , 4 устгасан
  1. 10 2
      src/emit.rs
  2. 9 1
      src/main.rs
  3. 1 1
      src/test.rs

+ 10 - 2
src/emit.rs

@@ -52,8 +52,16 @@ pub struct Contract<'a> {
 }
 
 impl<'a> Contract<'a> {
-    pub fn wasm(&self) -> Result<Vec<u8>, String> {
-        let target_machine = self.target.create_target_machine(WASMTRIPLE, "", "", OptimizationLevel::None, RelocMode::Default, CodeModel::Default).unwrap();
+    pub fn wasm(&self, opt: &str) -> Result<Vec<u8>, String> {
+        let opt = match opt {
+            "none" => OptimizationLevel::None,
+            "less" => OptimizationLevel::Less,
+            "default" => OptimizationLevel::Default,
+            "aggressive" => OptimizationLevel::Aggressive,
+            _ => unreachable!()
+        };
+
+        let target_machine = self.target.create_target_machine(WASMTRIPLE, "", "", opt, RelocMode::Default, CodeModel::Default).unwrap();
 
         match target_machine.write_to_memory_buffer(&self.module, FileType::Object) {
             Ok(o) => Ok(o.as_slice().to_vec()),

+ 9 - 1
src/main.rs

@@ -65,6 +65,14 @@ fn main() {
                 .takes_value(true)
                 .possible_values(&["cfg", "llvm", "bc", "object"]),
         )
+        .arg(
+            Arg::with_name("OPT")
+                .help("Set optimizer level")
+                .short("O")
+                .takes_value(true)
+                .possible_values(&["none", "less", "default", "aggressive"])
+                .default_value("default"),
+        )
         .arg(
             Arg::with_name("STD-JSON")
                 .help("mimic solidity json output on stdout")
@@ -159,7 +167,7 @@ fn main() {
                 continue;
             }
 
-            let obj = match contract.wasm() {
+            let obj = match contract.wasm(matches.value_of("OPT").unwrap()) {
                 Ok(o) => o,
                 Err(s) => {
                     println!("error: {}", s);

+ 1 - 1
src/test.rs

@@ -105,7 +105,7 @@ mod tests {
         // codegen
         let contract = emit::Contract::new(&contracts[0], &"foo.sol");
 
-        let obj = contract.wasm().expect("llvm wasm emit should work");
+        let obj = contract.wasm("default").expect("llvm wasm emit should work");
 
         let bc = link::link(&obj);