on master help sign in
Implement argument access under LLVM codegen
5946416Benjamin Saunders
llvm/defs.c+11
@@ -169,3 +169,14 @@ char *__idris_strRev(const char *s) {
169 }
169 }
170 return t;
170 return t;
171}
171}
172+
173+int __idris_argc;
174+char **__idris_argv;
175+
176+int idris_numArgs() {
177+ return __idris_argc;
178+}
179+
180+const char* idris_getArg(int i) {
181+ return __idris_argv[i];
182+}
src/IRTS/CodegenLLVM.hs+6
@@ -124,6 +124,10 @@ mainDef =
124 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpRealloc"
124 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpRealloc"
125 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpFree"
125 , ConstantOperand . C.GlobalReference . Name $ "__idris_gmpFree"
126 ]
126 ]
127+ , Do $ Store False (ConstantOperand . C.GlobalReference . Name $ "__idris_argc")
128+ (LocalReference (Name "argc")) Nothing 0 []
129+ , Do $ Store False (ConstantOperand . C.GlobalReference . Name $ "__idris_argv")
130+ (LocalReference (Name "argv")) Nothing 0 []
127 , UnName 1 := idrCall "{runMain0}" [] ]
131 , UnName 1 := idrCall "{runMain0}" [] ]
128 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
132 (Do $ Ret (Just (ConstantOperand (C.Int 32 0))) [])
129 ]}
133 ]}
@@ -198,6 +202,8 @@ initDefs tgt =
198 , exVar (stdinName tgt) ptrI8
202 , exVar (stdinName tgt) ptrI8
199 , exVar (stdoutName tgt) ptrI8
203 , exVar (stdoutName tgt) ptrI8
200 , exVar (stderrName tgt) ptrI8
204 , exVar (stderrName tgt) ptrI8
205+ , exVar "__idris_argc" (IntegerType 32)
206+ , exVar "__idris_argv" (PointerType ptrI8 (AddrSpace 0))
201 , GlobalDefinition mainDef
207 , GlobalDefinition mainDef
202 ] ++ map mpzBinFun ["add", "sub", "mul", "fdiv_q", "fdiv_r", "and", "ior", "xor"]
208 ] ++ map mpzBinFun ["add", "sub", "mul", "fdiv_q", "fdiv_r", "and", "ior", "xor"]
203 where
209 where