1313 * 3. Prevent C++ from infecting the rest of the project.
1414 */
1515
16- #include " zig_llvm.hpp "
16+ #include " zig_llvm.h "
1717
1818#include < llvm/Analysis/TargetLibraryInfo.h>
1919#include < llvm/Analysis/TargetTransformInfo.h>
3939
4040#include < lld/Driver/Driver.h>
4141
42+ #include < new>
43+
44+ #include < stdlib.h>
45+
46+ #if defined(_MSC_VER)
47+ #define ATTRIBUTE_RETURNS_NOALIAS __declspec (restrict )
48+ #else
49+ #define ATTRIBUTE_RETURNS_NOALIAS __attribute__ ((__malloc__))
50+ #endif
51+
4252using namespace llvm ;
4353
54+ template <typename T, typename ... Args>
55+ ATTRIBUTE_RETURNS_NOALIAS static inline T * create (Args... args) {
56+ T * ptr = reinterpret_cast <T*>(malloc (sizeof (T)));
57+ if (ptr == nullptr )
58+ return nullptr ;
59+ new (ptr) T (args...);
60+ return ptr;
61+ }
62+
63+ template <typename T>
64+ static inline void destroy (T * ptr) {
65+ if (ptr != nullptr ) {
66+ ptr[0 ].~T ();
67+ }
68+ free (ptr);
69+ }
70+
4471void ZigLLVMInitializeLoopStrengthReducePass (LLVMPassRegistryRef R) {
4572 initializeLoopStrengthReducePass (*unwrap (R));
4673}
@@ -50,8 +77,7 @@ void ZigLLVMInitializeLowerIntrinsicsPass(LLVMPassRegistryRef R) {
5077}
5178
5279char *ZigLLVMGetHostCPUName (void ) {
53- std::string str = sys::getHostCPUName ();
54- return strdup (str.c_str ());
80+ return strdup ((const char *)sys::getHostCPUName ().bytes_begin ());
5581}
5682
5783char *ZigLLVMGetNativeFeatures (void ) {
@@ -63,11 +89,11 @@ char *ZigLLVMGetNativeFeatures(void) {
6389 features.AddFeature (F.first (), F.second );
6490 }
6591
66- return strdup (features.getString (). c_str ());
92+ return strdup (( const char *) StringRef ( features.getString ()). bytes_begin ());
6793}
6894
6995static void addDiscriminatorsPass (const PassManagerBuilder &Builder, legacy::PassManagerBase &PM) {
70- PM.add (createAddDiscriminatorsPass ());
96+ PM.add (createAddDiscriminatorsPass ());
7197}
7298
7399#ifndef NDEBUG
@@ -82,15 +108,15 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM
82108 std::error_code EC;
83109 raw_fd_ostream dest (filename, EC, sys::fs::F_None);
84110 if (EC) {
85- *error_message = strdup (EC.message (). c_str ());
111+ *error_message = strdup (( const char *) StringRef ( EC.message ()). bytes_begin ());
86112 return true ;
87113 }
88114 TargetMachine* target_machine = reinterpret_cast <TargetMachine*>(targ_machine_ref);
89115 target_machine->setO0WantsFastISel (true );
90116
91117 Module* module = unwrap (module_ref);
92118
93- PassManagerBuilder *PMBuilder = new PassManagerBuilder ();
119+ PassManagerBuilder *PMBuilder = create< PassManagerBuilder> ();
94120 PMBuilder->OptLevel = target_machine->getOptLevel ();
95121 PMBuilder->SizeLevel = 0 ;
96122
@@ -123,7 +149,7 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM
123149
124150 // Set up the per-function pass manager.
125151 legacy::FunctionPassManager FPM = legacy::FunctionPassManager (module );
126- FPM.add (new TargetLibraryInfoWrapperPass (tlii));
152+ FPM.add (create< TargetLibraryInfoWrapperPass> (tlii));
127153 FPM.add (createTargetTransformInfoWrapperPass (target_machine->getTargetIRAnalysis ()));
128154 if (assertions_on) {
129155 FPM.add (createVerifierPass ());
@@ -415,7 +441,10 @@ unsigned ZigLLVMTag_DW_union_type(void) {
415441}
416442
417443ZigLLVMDIBuilder *ZigLLVMCreateDIBuilder (LLVMModuleRef module , bool allow_unresolved) {
418- DIBuilder *di_builder = new DIBuilder (*unwrap (module ), allow_unresolved);
444+ DIBuilder *di_builder = reinterpret_cast <DIBuilder*>(malloc (sizeof (DIBuilder)));
445+ if (di_builder == nullptr )
446+ return nullptr ;
447+ new (di_builder) DIBuilder (*unwrap (module ), allow_unresolved);
419448 return reinterpret_cast <ZigLLVMDIBuilder *>(di_builder);
420449}
421450
@@ -617,7 +646,7 @@ void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn_ref) {
617646 func->setAttributes (new_attr_set);
618647}
619648
620- void ZigLLVMParseCommandLineOptions (int argc, const char *const *argv) {
649+ void ZigLLVMParseCommandLineOptions (size_t argc, const char *const *argv) {
621650 llvm::cl::ParseCommandLineOptions (argc, argv);
622651}
623652
@@ -771,29 +800,35 @@ LLVMValueRef ZigLLVMBuildAShrExact(LLVMBuilderRef builder, LLVMValueRef LHS, LLV
771800}
772801
773802
774- #include " buffer.hpp"
803+ class MyOStream : public raw_ostream {
804+ public:
805+ MyOStream (void (*_append_diagnostic)(void *, const char *, size_t ), void *_context) :
806+ raw_ostream (true ), append_diagnostic(_append_diagnostic), context(_context), pos(0 ) {
807+
808+ }
809+ void write_impl (const char *ptr, size_t len) override {
810+ append_diagnostic (context, ptr, len);
811+ pos += len;
812+ }
813+ uint64_t current_pos () const override {
814+ return pos;
815+ }
816+ void (*append_diagnostic)(void *, const char *, size_t );
817+ void *context;
818+ size_t pos;
819+ };
820+
775821
776- bool ZigLLDLink (ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_count, Buf *diag_buf) {
822+ bool ZigLLDLink (ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_count,
823+ void (*append_diagnostic)(void *, const char *, size_t ), void *context)
824+ {
777825 ArrayRef<const char *> array_ref_args (args, arg_count);
778826
779- buf_resize (diag_buf, 0 );
780- class MyOStream : public raw_ostream {
781- public:
782- MyOStream (Buf *_diag_buf) : raw_ostream(true ), diag_buf(_diag_buf) {
783-
784- }
785- void write_impl (const char *ptr, size_t len) override {
786- buf_append_mem (diag_buf, ptr, len);
787- }
788- uint64_t current_pos () const override {
789- return buf_len (diag_buf);
790- }
791- Buf *diag_buf;
792- } diag (diag_buf);
827+ MyOStream diag (append_diagnostic, context);
793828
794829 switch (oformat) {
795830 case ZigLLVM_UnknownObjectFormat:
796- zig_unreachable ();
831+ assert ( false ); // unreachable
797832
798833 case ZigLLVM_COFF:
799834 return lld::coff::link (array_ref_args, false , diag);
@@ -805,7 +840,8 @@ bool ZigLLDLink(ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_
805840 return lld::mach_o::link (array_ref_args, diag);
806841
807842 case ZigLLVM_Wasm:
808- zig_panic ( " ZigLLDLink for Wasm" );
843+ assert ( false ); // TODO ZigLLDLink for Wasm
809844 }
810- zig_unreachable ();
845+ assert (false ); // unreachable
846+ abort ();
811847}
0 commit comments