瀏覽代碼

woking out, how to create object files

Nicolas Winkler 6 年之前
父節點
當前提交
bfb1c3ec90
共有 3 個文件被更改,包括 42 次插入10 次删除
  1. 27 4
      src/CodeGeneration.cpp
  2. 3 1
      src/CodeGeneration.h
  3. 12 5
      src/makefile

+ 27 - 4
src/CodeGeneration.cpp

@@ -1,23 +1,46 @@
 #include "CodeGeneration.h"
 
+#include <llvm/IR/LLVMContext.h>
+#include <llvm/IR/PassManager.h>
+#include <llvm/IR/Verifier.h>
+
 using namespace qlow;
 
+static llvm::LLVMContext context;
 
-void generateModule(const sem::SymbolTable<sem::Class>& classes)
+std::unique_ptr<llvm::Module> generateModule(const sem::SymbolTable<sem::Class>& classes)
 {
+    using llvm::Module;
+    std::unique_ptr<Module> module = llvm::make_unique<Module>("qlow_module", context);
 
+    return module;
 }
 
 
-void gen::generateObjectFile(const std::string& name, const sem::SymbolTable<sem::Class>& classes)
+void gen::generateObjectFile(const std::string& name, std::unique_ptr<llvm::Module> module,
+        const sem::SymbolTable<sem::Class>& classes)
 {
+    using llvm::PassManager;
+
+
+    llvm::verifyModule(*module);
+
+    PassManager<llvm::Module> pm;
+    //pm.add(createPrintModulePass(&outs()));
+    //pm.run(module);
+
+
     const char cpu[] = "generic";
     const char features[] = "";
 
+
+    /*
+    auto RM = llvm::Optional<llvm::Reloc::Model>();
     auto targetMachine =
         target->createTargetMachine(TargetTriple, CPU, Features, opt, RM);
 
-  TargetOptions opt;
+        */
+/*  TargetOptions opt;
   auto RM = Optional<Reloc::Model>();
   auto TheTargetMachine =
       Target->createTargetMachine(TargetTriple, CPU, Features, opt, RM);
@@ -46,7 +69,7 @@ void gen::generateObjectFile(const std::string& name, const sem::SymbolTable<sem
 
   outs() << "Wrote " << Filename << "\n";
 
-  return 0;
+  return 0;*/
 }
 
 

+ 3 - 1
src/CodeGeneration.h

@@ -2,12 +2,14 @@
 #define QLOW_CODE_GENERATION_H
 
 #include "Semantic.h"
+#include <llvm/IR/Module.h>
 
 namespace qlow
 {
     namespace gen
     {
-        void generateObjectFile(const std::string& name, const sem::SymbolTable<sem::Class>& classes);
+        void generateObjectFile(const std::string& name, std::unique_ptr<llvm::Module> module,
+            const sem::SymbolTable<sem::Class>& classes);
     }
 }
 

+ 12 - 5
src/makefile

@@ -1,6 +1,11 @@
+# building depends on debian packages: "g++" "llvm-dev" "bison" "flex" (and "make", duh)
+# running depends on "llvm"
+
 CXX := g++
-CXXFLAGS := -std=c++17 # -Wall -Wextra 
-LINKFLAGS :=
+
+INCLUDEDIRS := -I`llvm-config --includedir`
+CXXFLAGS := -std=c++17 $(INCLUDEDIRS) # -Wall -Wextra
+LDFLAGS := `llvm-config --ldflags --system-libs --libs all`
 
 YACC := bison
 YACCFLAGS := -d
@@ -13,19 +18,20 @@ OBJECTS := $(patsubst %.cpp, %.o, $(wildcard *.cpp)) \
 LIBRARIES := 
 EXECUTABLE := qlow
 
-
+.PHONY: all
 all: $(EXECUTABLE)
 
 
 
-release: CXXFLAGS += -O3
+release: CXXFLAGS += -O3 -flto
+release: LDFLAGS += -O3 -flto
 release: all
 
 debug: CXXFLAGS += -DDEBUGGING -g
 debug: all
 
 $(EXECUTABLE): $(OBJECTS)
-	$(CXX) $^ $(LINKFLAGS) -o $@
+	$(CXX) $^ $(LDFLAGS) -o $@
 
 
 %.o: %.cpp
@@ -39,6 +45,7 @@ $(EXECUTABLE): $(OBJECTS)
 
 
 
+.PHONY: clean
 clean:
 	rm -f $(EXECUTABLE) *.o parser.cpp parser.hpp lexer.cpp