move object generation files away from extern(C++) (#15477)

This commit is contained in:
Walter Bright 2023-07-31 01:11:29 -07:00 committed by GitHub
parent dfabf0a914
commit f7b3fab00f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 39 additions and 141 deletions

View file

@ -35,8 +35,6 @@ import dmd.backend.type;
import dmd.common.outbuffer;
extern (C++):
nothrow:
@safe:
@ -392,7 +390,7 @@ static if (MULTISCOPE)
__gshared
{
Rarray!(seg_data*) SegData;
extern (C++) Rarray!(seg_data*) SegData;
Objstate obj;
}
@ -418,49 +416,16 @@ void objrecord(uint rectyp, const(char)* record, uint reclen)
o.writeByten(0); // use 0 for checksum
}
@trusted
void too_many_symbols()
{
error(null, 0, 0, "more than %d symbols in object file", 0x7FFF);
error(null, 0, 0, "more than %d symbols in object file %s", 0x7FFF, obj.modname);
fatal();
}
version (X86) version (DigitalMars)
version = X86ASM;
version (X86ASM)
{
@trusted
int insidx(char *p,uint index)
{
asm nothrow
{
naked ;
mov EAX,[ESP+8] ; // index
mov ECX,[ESP+4] ; // p
cmp EAX,0x7F ;
jae L1 ;
mov [ECX],AL ;
mov EAX,1 ;
ret ;
L1: ;
cmp EAX,0x7FFF ;
ja L2 ;
mov [ECX+1],AL ;
or EAX,0x8000 ;
mov [ECX],AH ;
mov EAX,2 ;
ret ;
}
L2:
too_many_symbols();
}
}
else
{
@trusted
int insidx(char *p,uint index)
{
@ -485,7 +450,6 @@ int insidx(char *p,uint index)
return 0;
}
}
}
/**************************
* Insert a type index number.
@ -619,8 +583,7 @@ segidx_t OmfObj_seg_debugT()
* filename source file name
* csegname code segment name (can be null)
*/
@trusted
@system
Obj OmfObj_init(OutBuffer *objbuf, const(char)* filename, const(char)* csegname)
{
//printf("OmfObj_init()\n");

View file

@ -42,8 +42,6 @@ import dmd.backend.type;
import dmd.common.outbuffer;
extern (C++):
nothrow:
import dmd.backend.dwarf;
@ -273,7 +271,7 @@ IDXSYM MAP_SEG2SYMIDX(int seg) { return SegData[seg].SDsymidx; }
Elf32_Shdr* MAP_SEG2SEC(int seg) { return &SecHdrTab[MAP_SEG2SECIDX(seg)]; }
int MAP_SEG2TYP(int seg) { return MAP_SEG2SEC(seg).sh_flags & SHF_EXECINSTR ? CODE : DATA; }
extern Rarray!(seg_data*) SegData;
extern (C++) extern Rarray!(seg_data*) SegData;
int seg_tlsseg = UNKNOWN;
int seg_tlsseg_bss = UNKNOWN;
@ -626,7 +624,6 @@ int ElfObj_string_literal_segment(uint sz)
* csegname = name for code segment
*/
private
Obj ElfObj_init(OutBuffer *objbuf, const(char)* filename, const(char)* csegname)
{
//printf("ElfObj_init(filename = %s, csegname = %s)\n",filename,csegname);

View file

@ -35,8 +35,6 @@ import dmd.backend.type;
import dmd.common.outbuffer;
extern (C++):
nothrow:
@safe:
@ -220,7 +218,7 @@ int mach_seg_data_isCode(const ref seg_data sd)
__gshared
{
extern Rarray!(seg_data*) SegData;
extern (C++) extern Rarray!(seg_data*) SegData;
/**
* Section index for the __thread_vars/__tls_data section.
@ -439,7 +437,7 @@ int MachObj_string_literal_segment(uint sz)
* Perform initialization that applies to all .o output files.
* Called before any other obj_xxx routines
*/
@trusted
@system
Obj MachObj_init(OutBuffer *objbuf, const(char)* filename, const(char)* csegname)
{
//printf("MachObj_init()\n");

View file

@ -37,8 +37,6 @@ import dmd.backend.mscoff;
import dmd.common.outbuffer;
extern (C++):
nothrow:
@safe:
@ -234,7 +232,7 @@ int MsCoffObj_string_literal_segment(uint sz)
* One source file can generate multiple .obj files.
*/
@trusted
@system
Obj MsCoffObj_init(OutBuffer *objbuf, const(char)* filename, const(char)* csegname)
{
//printf("MsCoffObj_init()\n");

View file

@ -23,8 +23,6 @@ import dmd.backend.el;
import dmd.common.outbuffer;
extern (C++):
nothrow:
version (Windows)
@ -38,65 +36,6 @@ else
/******************************************************************/
/* Functions common to all object formats
*/
mixin(ObjMemDecl("Obj $Obj_init(OutBuffer *, const(char)* filename, const(char)* csegname)"));
mixin(ObjMemDecl("void $Obj_initfile(const(char)* filename, const(char)* csegname, const(char)* modname)"));
mixin(ObjMemDecl("void $Obj_termfile()"));
mixin(ObjMemDecl("void $Obj_term(const(char)* objfilename)"));
mixin(ObjMemDecl("void $Obj_linnum(Srcpos srcpos, int seg, targ_size_t offset)"));
mixin(ObjMemDecl("int $Obj_codeseg(const char *name,int suffix)"));
mixin(ObjMemDecl("void $Obj_startaddress(Symbol *)"));
mixin(ObjMemDecl("bool $Obj_includelib(const(char)* )"));
mixin(ObjMemDecl("bool $Obj_linkerdirective(const(char)* )"));
mixin(ObjMemDecl("bool $Obj_allowZeroSize()"));
mixin(ObjMemDecl("void $Obj_exestr(const(char)* p)"));
mixin(ObjMemDecl("void $Obj_user(const(char)* p)"));
mixin(ObjMemDecl("void $Obj_compiler(const(char)* p)"));
mixin(ObjMemDecl("void $Obj_wkext(Symbol *,Symbol *)"));
mixin(ObjMemDecl("void $Obj_alias(const(char)* n1,const(char)* n2)"));
mixin(ObjMemDecl("void $Obj_staticctor(Symbol *s,int dtor,int seg)"));
mixin(ObjMemDecl("void $Obj_staticdtor(Symbol *s)"));
mixin(ObjMemDecl("void $Obj_setModuleCtorDtor(Symbol *s, bool isCtor)"));
mixin(ObjMemDecl("void $Obj_ehtables(Symbol *sfunc,uint size,Symbol *ehsym)"));
mixin(ObjMemDecl("void $Obj_ehsections()"));
mixin(ObjMemDecl("void $Obj_moduleinfo(Symbol *scc)"));
mixin(ObjMemDecl("int $Obj_comdat(Symbol *)"));
mixin(ObjMemDecl("int $Obj_comdatsize(Symbol *, targ_size_t symsize)"));
mixin(ObjMemDecl("int $Obj_readonly_comdat(Symbol *s)"));
mixin(ObjMemDecl("void $Obj_setcodeseg(int seg)"));
mixin(ObjMemDecl("seg_data* $Obj_tlsseg()"));
mixin(ObjMemDecl("seg_data* $Obj_tlsseg_bss()"));
mixin(ObjMemDecl("seg_data* $Obj_tlsseg_data()"));
mixin(ObjMemDecl("void $Obj_export_symbol(Symbol *s, uint argsize)"));
mixin(ObjMemDecl("void $Obj_pubdef(int seg, Symbol *s, targ_size_t offset)"));
mixin(ObjMemDecl("void $Obj_pubdefsize(int seg, Symbol *s, targ_size_t offset, targ_size_t symsize)"));
mixin(ObjMemDecl("int $Obj_external_def(const(char)*)"));
mixin(ObjMemDecl("int $Obj_data_start(Symbol *sdata, targ_size_t datasize, int seg)"));
mixin(ObjMemDecl("int $Obj_external(Symbol *)"));
mixin(ObjMemDecl("int $Obj_common_block(Symbol *s, targ_size_t size, targ_size_t count)"));
mixin(ObjMemDecl("int $Obj_common_block(Symbol *s, int flag, targ_size_t size, targ_size_t count)"));
mixin(ObjMemDecl("void $Obj_lidata(int seg, targ_size_t offset, targ_size_t count)"));
mixin(ObjMemDecl("void $Obj_write_zeros(seg_data *pseg, targ_size_t count)"));
mixin(ObjMemDecl("void $Obj_write_byte(seg_data *pseg, uint _byte)"));
mixin(ObjMemDecl("void $Obj_write_bytes(seg_data *pseg, uint nbytes, const(void)* p)"));
mixin(ObjMemDecl("void $Obj_byte(int seg, targ_size_t offset, uint _byte)"));
mixin(ObjMemDecl("uint $Obj_bytes(int seg, targ_size_t offset, uint nbytes, const(void)* p)"));
mixin(ObjMemDecl("void $Obj_reftodatseg(int seg, targ_size_t offset, targ_size_t val, uint targetdatum, int flags)"));
mixin(ObjMemDecl("void $Obj_reftocodeseg(int seg, targ_size_t offset, targ_size_t val)"));
mixin(ObjMemDecl("int $Obj_reftoident(int seg, targ_size_t offset, Symbol *s, targ_size_t val, int flags)"));
mixin(ObjMemDecl("void $Obj_far16thunk(Symbol *s)"));
mixin(ObjMemDecl("void $Obj_fltused()"));
mixin(ObjMemDecl("int $Obj_data_readonly(char *p, int len, int *pseg)"));
mixin(ObjMemDecl("int $Obj_data_readonly(char *p, int len)"));
mixin(ObjMemDecl("int $Obj_string_literal_segment(uint sz)"));
mixin(ObjMemDecl("Symbol* $Obj_sym_cdata(tym_t, char *, int)"));
mixin(ObjMemDecl("void $Obj_func_start(Symbol *sfunc)"));
mixin(ObjMemDecl("void $Obj_func_term(Symbol *sfunc)"));
mixin(ObjMemDecl("void $Obj_write_pointerRef(Symbol* s, uint off)"));
mixin(ObjMemDecl("int $Obj_jmpTableSegment(Symbol* s)"));
mixin(ObjMemDecl("Symbol* $Obj_tlv_bootstrap()"));
import dmd.backend.cgobj;
import dmd.backend.mscoffobj;
import dmd.backend.elfobj;

View file

@ -342,6 +342,9 @@ private void obj_start(ref OutBuffer objbuf, const(char)* srcfile)
version (Windows)
{
import dmd.backend.mscoffobj;
import dmd.backend.cgobj;
// Produce Ms COFF files by default, OMF for -m32omf
assert(objbuf.length() == 0);
switch (target.objectFormat())

View file

@ -243,11 +243,11 @@ void test12()
{
real x = 3;
creal a = (2 + 4i) % 3;
printf("%Lg %Lgi\n", a.re, a.im);
//printf("%Lg %Lgi\n", a.re, a.im);
assert(a == 2 + 1i);
creal b = (2 + 4i) % x;
printf("%Lg %Lgi\n", b.re, b.im);
//printf("%Lg %Lgi\n", b.re, b.im);
assert(b == a);
}
@ -257,7 +257,7 @@ void test13()
{
ireal a = 5i;
ireal b = a % 2;
printf("%Lg %Lgi\n", b.re, b.im);
//printf("%Lg %Lgi\n", b.re, b.im);
assert(b == 1i);
}
@ -530,9 +530,9 @@ void test22()
{
static creal[] params = [1+0i, 3+0i, 5+0i];
printf("params[0] = %Lf + %Lfi\n", params[0].re, params[0].im);
printf("params[1] = %Lf + %Lfi\n", params[1].re, params[1].im);
printf("params[2] = %Lf + %Lfi\n", params[2].re, params[2].im);
//printf("params[0] = %Lf + %Lfi\n", params[0].re, params[0].im);
//printf("params[1] = %Lf + %Lfi\n", params[1].re, params[1].im);
//printf("params[2] = %Lf + %Lfi\n", params[2].re, params[2].im);
creal[] sums = new creal[3];
sums[] = 0+0i;
@ -603,19 +603,19 @@ float func_24_4(float f, double d)
void test24()
{
ifloat f = func_24_1(10i, 8);
printf("%fi\n", f);
//printf("%fi\n", f);
// assert(f == 1.25i);
f = func_24_2(10i, 8);
printf("%fi\n", f);
//printf("%fi\n", f);
assert(f == 1.25i);
float g = func_24_3(10, 8);
printf("%f\n", g);
//printf("%f\n", g);
// assert(g == 1.25);
g = func_24_4(10, 8);
printf("%f\n", g);
//printf("%f\n", g);
assert(g == 1.25);
}
@ -647,9 +647,9 @@ void test26()
foreach( cdouble z; A )
{
s = toString26(z);
printf("%.*s ", cast(int)s.length, s.ptr);
//printf("%.*s ", cast(int)s.length, s.ptr);
}
printf("\n");
//printf("\n");
for(int ii=0; ii<A.length; ii++ )
A[ii] += -1i*A[ii];
@ -661,9 +661,9 @@ void test26()
foreach( cdouble z; A )
{
s = toString26(z);
printf("%.*s ", cast(int)s.length, s.ptr);
//printf("%.*s ", cast(int)s.length, s.ptr);
}
printf("\n");
//printf("\n");
}
/*************************************/
@ -698,19 +698,19 @@ void test28()
void test29()
{
ireal a = 6.5i % 3i;
printf("%Lfi %Lfi\n", a, a - .5i);
//printf("%Lfi %Lfi\n", a, a - .5i);
assert(a == .5i);
a = 6.5i % 3;
printf("%Lfi %Lfi\n", a, a - .5i);
//printf("%Lfi %Lfi\n", a, a - .5i);
assert(a == .5i);
real b = 6.5 % 3i;
printf("%Lf %Lf\n", b, b - .5);
//printf("%Lf %Lf\n", b, b - .5);
assert(b == .5);
b = 6.5 % 3;
printf("%Lf %Lf\n", b, b - .5);
//printf("%Lf %Lf\n", b, b - .5);
assert(b == .5);
}
@ -720,17 +720,17 @@ void test30()
{
cfloat f = 1+0i;
f %= 2fi;
printf("%f + %fi\n", f.re, f.im);
//printf("%f + %fi\n", f.re, f.im);
assert(f == 1 + 0i);
cdouble d = 1+0i;
d %= 2i;
printf("%f + %fi\n", d.re, d.im);
//printf("%f + %fi\n", d.re, d.im);
assert(d == 1 + 0i);
creal r = 1+0i;
r %= 2i;
printf("%Lf + %Lfi\n", r.re, r.im);
//printf("%Lf + %Lfi\n", r.re, r.im);
assert(r == 1 + 0i);
}
@ -740,17 +740,17 @@ void test31()
{
cfloat f = 1+0i;
f %= 2i;
printf("%f + %fi\n", f.re, f.im);
//printf("%f + %fi\n", f.re, f.im);
assert(f == 1);
cdouble d = 1+0i;
d = d % 2i;
printf("%f + %fi\n", d.re, d.im);
//printf("%f + %fi\n", d.re, d.im);
assert(d == 1);
creal r = 1+0i;
r = r % 2i;
printf("%Lf + %Lfi\n", r.re, r.im);
//printf("%Lf + %Lfi\n", r.re, r.im);
assert(r == 1);
}
@ -770,7 +770,7 @@ void assertEqual(real* a, real* b, string file = __FILE__, size_t line = __LINE_
{
if (x[i] != y[i])
{
printf("%02zd: %02x %02x\n", i, x[i], y[i]);
//printf("%02zd: %02x %02x\n", i, x[i], y[i]);
import core.exception;
throw new AssertError(file, line);
}
@ -856,7 +856,7 @@ void test35()
void test36()
{
ireal imag = 2.5i;
printf ("test of imag*imag = %Lf\n",imag*imag);
//printf ("test of imag*imag = %Lf\n",imag*imag);
assert(imag * imag == -6.25);
}
@ -885,7 +885,7 @@ void test39()
creal z = 1 + 2.5i;
real e = z.im;
printf ("e = %Lf\n", e);
//printf ("e = %Lf\n", e);
assert(e == 2.5);
}
@ -942,7 +942,7 @@ void test44()
{
ifloat f = 1.0fi;
// f *= 2.0fi; // illegal but compiles
printf("%g\n", f);
//printf("%g\n", f);
// assert(f == 0i);
}